4441
Software / Re:Spusteni programu
« kdy: 28. 05. 2016, 08:47:46 »
Pokud uvedete jenom název programu (bez cesty), tedy ve vašem případě
hledá se program na aktuální cestě (proměnná prostředí $PATH). To je důvod, proč nebude fungovat postup, který popsal 00.
Pokud chcete spustit program na konkrétní cestě, musíte uvést tu cestu – relativní nebo absolutní. Když chcete spustit skript program z aktuálního adresáře, musíte tedy uvést
Pokud byste to takhle napsal do skriptu, aktuální adresář je ten, ve kterém skript spouštíte, ne ten, kde je umístěn skript. Takže by vám to fungovalo jen v případě, kdy byste byl v tom adresáři se skriptem. Kdybyste ho spustil třeba příkazem
nebude vám to fungovat.
Takže potřebujete zjistit adresář, ve kterém se ten spouštěcí skript nachází, abyste mohl program zavolat ze správného adresáře. Jméno aktuálně spouštěného programu/příkazu je uložené v proměnné prostředí $0, takže ve skriptu příkazem
zjistíte, jak jste skript spustil. Když tedy skript spustíte příkazem
bude $0 obsahovat právě to ./dir/script.sh.
Teď už tedy máte cestu ke skriptu, a z ní dokážete odvodit cestu k programu. Potřebujete jenom z cesty k souboru udělat cestu k nadřazenému adresáři, k tomu slouží příkaz dirname. Takže ten skript může vypadat takhle nějak:
První řádek říká jádru (nebo shellu, kdybyste to spouštěl na jiném systému, kde to jádro nepodporuje), že má daný skript spustit s pomocí příkazu /bin/sh.
Skriptu pak musíte nastavit právo ke spuštění, jak psal 00.
Ten skript pak můžete volat odkudkoli a vždy spustí program ABC v tom adresáři, kde je uvedený skript. Nebude to fungovat v případě, že byste si na skript udělal symbolický odkaz – ale i to se dá ve skriptu ošetřit.
Pokud byste potřeboval, aby se program spustil vždy s aktuálním adresářem nastaveným na adresář, kde je ten program, před zavoláním programu se pomocí cd do příslušného adresáře přesuňte:
Ty dvojité uvozovky ošetřují případy, kdy by v cestě byla mezera – aby to bylo chápáno jako jeden parametr a mezera to nerozdělila na víc parametrů. Obrácené apostrofy udělají to, že se text v nich uvedený spustí jako příkaz a jeho výstup se vloží na místo toho příkazu.
Kód: [Vybrat]
ABC --portablehledá se program na aktuální cestě (proměnná prostředí $PATH). To je důvod, proč nebude fungovat postup, který popsal 00.
Pokud chcete spustit program na konkrétní cestě, musíte uvést tu cestu – relativní nebo absolutní. Když chcete spustit skript program z aktuálního adresáře, musíte tedy uvést
Kód: [Vybrat]
./ABC --portablePokud byste to takhle napsal do skriptu, aktuální adresář je ten, ve kterém skript spouštíte, ne ten, kde je umístěn skript. Takže by vám to fungovalo jen v případě, kdy byste byl v tom adresáři se skriptem. Kdybyste ho spustil třeba příkazem
Kód: [Vybrat]
./dir/script.shnebude vám to fungovat.
Takže potřebujete zjistit adresář, ve kterém se ten spouštěcí skript nachází, abyste mohl program zavolat ze správného adresáře. Jméno aktuálně spouštěného programu/příkazu je uložené v proměnné prostředí $0, takže ve skriptu příkazem
Kód: [Vybrat]
echo $0zjistíte, jak jste skript spustil. Když tedy skript spustíte příkazem
Kód: [Vybrat]
./dir/script.shbude $0 obsahovat právě to ./dir/script.sh.
Teď už tedy máte cestu ke skriptu, a z ní dokážete odvodit cestu k programu. Potřebujete jenom z cesty k souboru udělat cestu k nadřazenému adresáři, k tomu slouží příkaz dirname. Takže ten skript může vypadat takhle nějak:
Kód: [Vybrat]
#!/bin/sh
"`dirname \"$0\"`/ABC --portable"
První řádek říká jádru (nebo shellu, kdybyste to spouštěl na jiném systému, kde to jádro nepodporuje), že má daný skript spustit s pomocí příkazu /bin/sh.
Skriptu pak musíte nastavit právo ke spuštění, jak psal 00.
Ten skript pak můžete volat odkudkoli a vždy spustí program ABC v tom adresáři, kde je uvedený skript. Nebude to fungovat v případě, že byste si na skript udělal symbolický odkaz – ale i to se dá ve skriptu ošetřit.
Pokud byste potřeboval, aby se program spustil vždy s aktuálním adresářem nastaveným na adresář, kde je ten program, před zavoláním programu se pomocí cd do příslušného adresáře přesuňte:
Kód: [Vybrat]
#!/bin/sh
cd "`dirname \"$0\"`"
./ABC --portable
Ty dvojité uvozovky ošetřují případy, kdy by v cestě byla mezera – aby to bylo chápáno jako jeden parametr a mezera to nerozdělila na víc parametrů. Obrácené apostrofy udělají to, že se text v nich uvedený spustí jako příkaz a jeho výstup se vloží na místo toho příkazu.