Fórum Root.cz
Hlavní témata => Software => Téma založeno: Pepek 28. 05. 2016, 02:46:05
-
Ahoj vsem sem novacek ve svete linuxu.
Mam program napriklad ABC ktery potrebuji spustit a dat mu prikaz --portable
Chtel bych vytvorit sh skript ktery me tento program v aktualni slozce spusti muze mi nekdo pomoci jaky je spravny zapis do skriptu dekuji
-
Do souboru napiš
nazevprogramu --portable
A spusť "chmod +x nazevsouboru" (bez uvozovek) v terminálu ve složce, kde je soubor
-
Pokud uvedete jenom název programu (bez cesty), tedy ve vašem případě
ABC --portable
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
./ABC --portable
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
./dir/script.sh
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
echo $0
zjistíte, jak jste skript spustil. Když tedy skript spustíte příkazem
./dir/script.sh
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:
#!/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:
#!/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.
-
tento obsah uloz do adresare /usr/local/bin jako napr abc.sh
(tvuj oblibeny editor je potreba pusti jako root, tedy pomoci: sudo nejakejeditor)
(nebo ho pak jen zkopirovat uz vytvoreny jako root, tedy pomoci: sudo cp /home/Pepek/abc.sh /usr/local/bin/)
#!/bin.sh
ABC --portable
a nastav mu atribut spustitelny:
chmod +x /usr/local/bin/abc.sh
cesta k adresari /usr/local/bin je ve vychozim stavu jiz nastavena v PATH promene, ktera se prohledava automaticky
/usr/local/bin (nebo /usr/local/sbin pro systemove nastroje) slouzi prave k ukladani uzivatelsky pridanych programu/skriptu...
-
#!/bin.sh
ABC --portable
Tohle nebude fungovat, pokud program ABC není uložen v adresáři, který je v cestě (proměnná PATH).
-
Filip Jirsák: děkuji jako jedinej pochopil že ten program nenám nainstalovanej tak nemůže být v pathu
-
Tak mi to stejne nejde :-(
Prikaz jak by se to melo spustit: In the CryoV directory, run: 'python CryoV --portable'
Slozka se jmenuje CryoV a bude se casto presouvat
Takze potrebuji aby kdyz v ni spustim skript pracoval jako s aktualnim adresarem
#!/bin/sh
cd "`dirname \"$0\"`"
./CryoV python CryoV --portable
Tohle mi nejde co delam spatne ?
-
Akorat tedy Jirsak na to asi jde nejak slozite. Pokud je skript i program ve stejnem asresari, tak by snad melo fungovat ./ABC blabla.
@pepek:
#!/bin/sh
python ./CryoV --portable
-
Tak mi to stejne nejde :-(
Prikaz jak by se to melo spustit: In the CryoV directory, run: 'python CryoV --portable'
Slozka se jmenuje CryoV a bude se casto presouvat
Takze potrebuji aby kdyz v ni spustim skript pracoval jako s aktualnim adresarem
#!/bin/sh
cd "`dirname \"$0\"`"
./CryoV python CryoV --portable
Tohle mi nejde co delam spatne ?
Máte tam na začátku znova CryoV. Vypotřebujete spustit python a jemu jako parametry předat CryoV --portable
Tedy:
#!/bin/sh
cd "`dirname \"$0\"`"
python CryoV --portable
-
Akorat tedy Jirsak na to asi jde nejak slozite. Pokud je skript i program ve stejnem asresari, tak by snad melo fungovat ./ABC blabla.
Vysvětlení, proč tohle nebude univerzálně fungovat, jsem v tom komentáři napsal. ./ABC spustí ABC z aktuálního adresáře, což může být jiný adresář, než ten, kde je umístěn skript.
-
Tak ja predpokladal, ze by skript by s programem v jednom adresari. Dost mi totiz unika, proc by nekdo chtel spoustet program tak, ze se prepne do adresare s programem a ten nasledne spoustel stylem /home/pepek/strasna\ cesta/do\ ktere\ davam\ skripty/skript.sh . Krome toho, pokud jsem v adresari, ve kterem je program, tak by mi asi ve skriptu ./ABC furt chodilo, i kdyz skript je jinde. Skript by mel pracovat s adresarem, ve kterem jsem, ne s adresarem, kde je skript.
-
Dost mi totiz unika, proc by nekdo chtel spoustet program tak, ze se prepne do adresare s programem a ten nasledne spoustel stylem /home/pepek/strasna\ cesta/do\ ktere\ davam\ skripty/skript.sh .
Ano. A pak je tady ta druhá varianta, že se dotyčný nepřepne do adresáře s programem, a přesto chce ten program spustit.
Krome toho, pokud jsem v adresari, ve kterem je program, tak by mi asi ve skriptu ./ABC furt chodilo, i kdyz skript je jinde.
Akorát pořád musíte lézt do toho adresáře s programem.
Skript by mel pracovat s adresarem, ve kterem jsem, ne s adresarem, kde je skript.
To je dost zvláštní požadavek. Naštěstí se takhle spouštěcí skripty obvykle nechovají.
-
Dost mi totiz unika, proc by nekdo chtel spoustet program tak, ze se prepne do adresare s programem a ten nasledne spoustel stylem /home/pepek/strasna\ cesta/do\ ktere\ davam\ skripty/skript.sh .
Ano. A pak je tady ta druhá varianta, že se dotyčný nepřepne do adresáře s programem, a přesto chce ten program spustit.
Jo, ale vzhledem k tomu, jak je polozen dotaz, muzeme leda tak teoretizovat. Nevime, ze ktereho adresare chce ten program spustit, ani jestli skript je ve stejnem adresari. Ostatne nevim, proc nenapsat do skriptu natvrdo celou cestu k programu.
Skript by mel pracovat s adresarem, ve kterem jsem, ne s adresarem, kde je skript.
To je dost zvláštní požadavek. Naštěstí se takhle spouštěcí skripty obvykle nechovají.
Tak si napiste nejaky skript, kde bude akorat pwd. Prepnete se do jineho adresare a skript spustte. Schvalne, jaky adresar vam to vypise.
-
Ostatne nevim, proc nenapsat do skriptu natvrdo celou cestu k programu.
Protože se program bude často stěhovat.
Tak si napiste nejaky skript, kde bude akorat pwd. Prepnete se do jineho adresare a skript spustte. Schvalne, jaky adresar vam to vypise.
Vypíše to aktuální adresář, ne adresář se skriptem. Samozřejmě že jsem si to vyzkoušel, než jsem ten první komentář napsal.
$mkdir test
$echo '#!/bin/bash' > test/script.sh
$echo 'echo `pwd`' >> test/script.sh
$chmod u+x test/script.sh
$pwd
/home/filip
$test/script.sh
/home/filip
Dotaz už jsem zodpověděl, všechny příkazy, které jsem uváděl, jsem si samozřejmě vyzkoušel a fungují tak, jak jsem popsal. Takže mi připadá zbytečné sem jen tak od boku střílet nějaké domněnky, které si někdo ani neověří.