Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jakub 03. 05. 2015, 15:04:28

Název: Tvorba adresářů v bash skriptu
Přispěvatel: Jakub 03. 05. 2015, 15:04:28
Ahoj, co je prosím na tomto příkazu špatně ?
Kód: [Vybrat]
test ! -d /root/.temp && mkdir /root/.temp || exit 1
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub Galgonek 03. 05. 2015, 15:33:26
A co by s ním mělo být špatně?
Název: Re:Problém s příkazem v BASH
Přispěvatel: black3r 03. 05. 2015, 16:06:36
azda jedine to, ze je prilis zbytocne komplikovany na to, ze robi to iste ako
Kód: [Vybrat]
mkdir -p /root/.temp 2>/dev/null
Název: Re:Problém s příkazem v BASH
Přispěvatel: Lol Phirae 03. 05. 2015, 16:23:54
Tu kravinu s test (http://unixhelp.ed.ac.uk/CGI/man-cgi?test) jsem nikdy nepobral. K čemu to je dobré, když to stejně píšeš pro bash?

Kód: [Vybrat]
[[ -d /root/.temp ]] || mkdir /root/.temp
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub Galgonek 03. 05. 2015, 16:25:09
azda jedine to, ze je prilis zbytocne komplikovany na to, ze robi to iste ako
Kód: [Vybrat]
mkdir -p /root/.temp 2>/dev/null

To isté to jistě není. Původní příkaz hlavně v případě, že adresář /root/.temp už existuje nebo se ho nepodaří vytvořit, ukončí bash.
Název: Re:Problém s příkazem v BASH
Přispěvatel: Lol Phirae 03. 05. 2015, 16:28:36
v případě, že adresář /root/.temp už existuje ... ukončí bash.

To asi ne, že...  ::)
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub Galgonek 03. 05. 2015, 16:35:57
v případě, že adresář /root/.temp už existuje ... ukončí bash.

To asi ne, že...  ::)

Ale jo, přesně to ten původní příkaz udělá ...
Název: Re:Problém s příkazem v BASH
Přispěvatel: Lol Phirae 03. 05. 2015, 16:42:51
Tak určitě...  ::)
Název: Re:Problém s příkazem v BASH
Přispěvatel: mhepp 03. 05. 2015, 18:09:10
Tak určitě...  ::)

A co ten exit 1? Ten je tam proč?
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub 03. 05. 2015, 19:10:22
Bylo to myšleno tak, že má použít exit 1 když se nepodaří adreář temp vytvořit. Jenže se ukončí vždy když adresář již existuje.
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub Galgonek 03. 05. 2015, 19:27:24
Bylo to myšleno tak, že má použít exit 1 když se nepodaří adreář temp vytvořit. Jenže se ukončí vždy když adresář již existuje.

Pak tedy nějak takto:
Kód: [Vybrat]
test -d /root/.temp || mkdir /root/.temp || exit 1
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub 03. 05. 2015, 19:32:26
Děkuji a jaká je přesně rozdíl mezi tímto ?

Kód: [Vybrat]
test -d /root/.temp && mkdir /root/.temp
test -d /root/.temp || mkdir /root/.temp
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub Galgonek 03. 05. 2015, 19:53:58
Děkuji a jaká je přesně rozdíl mezi tímto ?

Kód: [Vybrat]
test -d /root/.temp && mkdir /root/.temp
test -d /root/.temp || mkdir /root/.temp

V prvním případě (&&) se mkdir /root/.temp vykoná, pokud test -d /root/.temp uspěje (návratová hodnota je 0). V druhém případě (||) se mkdir /root/.temp naopak vykoná, pokud test -d /root/.temp selže (návratová hodnota je kladná).

Pokud jde tedy pouze o vytvoření adresáře, pokud neexistuje, jsou následující dva příkazy ekvivalentní:
Kód: [Vybrat]
test ! -d /root/.temp && mkdir /root/.temp
test -d /root/.temp || mkdir /root/.temp

Liší se však celkovou návratovou hodnotou, která odpovídá logickým operátorům && a ||, proto tyto příkazy už nejsou ekvivalentní, pokud se za ně navíc ještě připojí || exit 1. Pozor jen, že v shelu 0 znamená true a kladná hodnota false.
Název: Re:Problém s příkazem v BASH
Přispěvatel: nobody 03. 05. 2015, 19:55:45
za && se provede pokud predchozi error code je 0
za || se provede pokud predchozi error code je >=1

error code se nachazi v promene $?, muzes si to zobrazit pro predstavu:
Kód: [Vybrat]
test -d /root/.temp; echo $?
test ! -d /root/.temp; echo $?
a pri pouziti && a ||:
Kód: [Vybrat]
test -d /root/.temp && echo JeTu || echo NeniTu
test ! -d /root/.temp && echo NeniTu || echo JeTu
ale jak bylo receno, zamysli se nad tim vyhozenim test a misto toho pro tve potreby tedy:
Kód: [Vybrat]
[[ -d /root/.temp ]] || mkdir /root/.temp || exit 1
Název: Re:Problém s příkazem v BASH
Přispěvatel: Jakub 03. 05. 2015, 20:28:42
Děkuji. Je to složitější než jsem si myslel :( Musím Vámi uvedené informace pořádně otestovat. Ještě se zeptám na takovou drobnost, je lepší použít script který načte cca 200 funkcí při startu a pak je mám jen volat, nebo je mám vždy až před spuštěním dané funkce sourcnout? Nebo nepoužívat funkce a jen přímo sourcnout daný soubor který provede co má. Díky za pomoc.
Název: Re:Problém s příkazem v BASH
Přispěvatel: matfyzak11235 03. 05. 2015, 22:43:29
Pozor na TOCTOU bugy. Pred mkdir netreba testovat, ci tam adresar je - ked tam bude, tak mkdir vrati chybu.

Ještě se zeptám na takovou drobnost, je lepší použít script který načte cca 200 funkcí při startu a pak je mám jen volat, nebo je mám vždy až před spuštěním dané funkce sourcnout? Nebo nepoužívat funkce a jen přímo sourcnout daný soubor který provede co má. Díky za pomoc.
Ja by som to sourcol hned na zaciatku. Inak sa to mozno bude citat zbytocne viackrat.
Název: Re:Problém s příkazem v BASH
Přispěvatel: matfyzak11235 03. 05. 2015, 23:12:11
Tu kravinu s test (http://unixhelp.ed.ac.uk/CGI/man-cgi?test) jsem nikdy nepobral. K čemu to je dobré, když to stejně píšeš pro bash?

Kód: [Vybrat]
[[ -d /root/.temp ]] || mkdir /root/.temp
Apage satanas!

Preco pisat pre bash, ked to nie je treba? Debian pouziva dash ako /bin/sh. Tam teda nefunguje sh skript_s_bashizmami.sh. A ani spustenie, ked ma shebang #!/bin/sh. Takze pouzivanim zbytocne nekompatibilnych prikazov si iba koledujes o problem, napriklad pri prenose na iny system.
Název: Re:Tvorba adresářů v bash skriptu
Přispěvatel: Jakub 04. 05. 2015, 18:33:54
A jaké to jsou ty "nekompatibilní prikazy" ?
Název: Re:Problém s příkazem v BASH
Přispěvatel: Lol Phirae 04. 05. 2015, 18:57:07
Tu kravinu s test (http://unixhelp.ed.ac.uk/CGI/man-cgi?test) jsem nikdy nepobral. K čemu to je dobré, když to stejně píšeš pro bash?

Kód: [Vybrat]
[[ -d /root/.temp ]] || mkdir /root/.temp
Apage satanas!

Preco pisat pre bash, ked to nie je treba?

Přečti si předmět dotazu a zeptej se autora. Mě třeba připitoměly dash v Debianu fakt nezajímá a do bash skriptů žádné #!/bin/sh nepíšu. Tak zklidni hormón.
Název: Re:Tvorba adresářů v bash skriptu
Přispěvatel: Jakub Galgonek 04. 05. 2015, 20:27:13
A jaké to jsou ty "nekompatibilní prikazy" ?

Nekompatibilních konstrukcí je více než dost. Něco o tom se psalo třeba na http://www.abclinuxu.cz/clanky/odstranujeme-bashismy (http://www.abclinuxu.cz/clanky/odstranujeme-bashismy). Je tam i zmíněn skript http://sourceforge.net/projects/checkbaskisms/ (http://sourceforge.net/projects/checkbaskisms/), který se ve sktiptu takové bashismy snaží detekovat.
Název: Re:Tvorba adresářů v bash skriptu
Přispěvatel: Lol Phirae 05. 05. 2015, 00:09:33
A jaké to jsou ty "nekompatibilní prikazy" ?

Nekompatibilních konstrukcí je více než dost. Něco o tom se psalo třeba na http://www.abclinuxu.cz/clanky/odstranujeme-bashismy (http://www.abclinuxu.cz/clanky/odstranujeme-bashismy). Je tam i zmíněn skript http://sourceforge.net/projects/checkbaskisms/ (http://sourceforge.net/projects/checkbaskisms/), který se ve sktiptu takové bashismy snaží detekovat.

Ano. A celá tahle šaškárna se provozovala kvůli "zrychlení" startu systému. Aby se to pak celé spláchlo a nasadila se defaultně Lennartova blog mrdka, čímž se to celé stalo zcela bezpředmětným. Takže, nechť si zase Debian ráčí tu dash nádheru zasunout tam, kam vždycky patřila.
Název: Re:Tvorba adresářů v bash skriptu
Přispěvatel: Jakub Galgonek 05. 05. 2015, 00:35:37
Pokud skript začíná #!/bin/sh, tak by bashismy obsahovat neměl. Pokud začíná #!/bin/bash, tak ať si je klidně má.