Spuštěni programu ze skriptu

Pepek

Spuštěni programu ze skriptu
« kdy: 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
« Poslední změna: 30. 05. 2016, 10:40:58 od Petr Krčmář »


00

Re:Spusteni programu
« Odpověď #1 kdy: 28. 05. 2016, 08:05:01 »
Do souboru napiš

nazevprogramu --portable

A spusť "chmod +x nazevsouboru" (bez uvozovek) v terminálu ve složce, kde je soubor

Re:Spusteni programu
« Odpověď #2 kdy: 28. 05. 2016, 08:47:46 »
Pokud uvedete jenom název programu (bez cesty), tedy ve vašem případě

Kód: [Vybrat]
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

Kód: [Vybrat]
./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

Kód: [Vybrat]
./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

Kód: [Vybrat]
echo $0
zjistíte, jak jste skript spustil. Když tedy skript spustíte příkazem

Kód: [Vybrat]
./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:

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.

nobody(ten pravej)

Re:Spusteni programu
« Odpověď #3 kdy: 28. 05. 2016, 13:40:27 »
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/)
Kód: [Vybrat]
#!/bin.sh
ABC --portable
a nastav mu atribut spustitelny:
Kód: [Vybrat]
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...

Re:Spusteni programu
« Odpověď #4 kdy: 28. 05. 2016, 13:48:53 »
Kód: [Vybrat]
#!/bin.sh
ABC --portable
Tohle nebude fungovat, pokud program ABC není uložen v adresáři, který je v cestě (proměnná PATH).


Pepek

Re:Spusteni programu
« Odpověď #5 kdy: 28. 05. 2016, 19:50:54 »
Filip Jirsák: děkuji jako jedinej pochopil že ten program nenám nainstalovanej tak nemůže být v pathu

pepek

Re:Spusteni programu
« Odpověď #6 kdy: 28. 05. 2016, 20:15:48 »
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

Kód: [Vybrat]
#!/bin/sh
cd "`dirname \"$0\"`"
./CryoV python CryoV --portable

Tohle mi nejde co delam spatne ?

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Spusteni programu
« Odpověď #7 kdy: 28. 05. 2016, 20:28:12 »
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

Re:Spusteni programu
« Odpověď #8 kdy: 28. 05. 2016, 21:16:35 »
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

Kód: [Vybrat]
#!/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:
Kód: [Vybrat]
#!/bin/sh
cd "`dirname \"$0\"`"
python CryoV --portable

Re:Spusteni programu
« Odpověď #9 kdy: 28. 05. 2016, 21:20:54 »
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.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Spusteni programu
« Odpověď #10 kdy: 28. 05. 2016, 21:55:48 »
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.

Re:Spusteni programu
« Odpověď #11 kdy: 28. 05. 2016, 22:12:45 »
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í.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Spusteni programu
« Odpověď #12 kdy: 28. 05. 2016, 22:30:41 »
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.

Citace
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.

Re:Spusteni programu
« Odpověď #13 kdy: 28. 05. 2016, 23:23:52 »
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.

Kód: [Vybrat]
$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ěří.