Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Jakub 03. 05. 2015, 15:04:28
-
Ahoj, co je prosím na tomto příkazu špatně ?
test ! -d /root/.temp && mkdir /root/.temp || exit 1
-
A co by s ním mělo být špatně?
-
azda jedine to, ze je prilis zbytocne komplikovany na to, ze robi to iste ako
mkdir -p /root/.temp 2>/dev/null
-
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?
[[ -d /root/.temp ]] || mkdir /root/.temp
-
azda jedine to, ze je prilis zbytocne komplikovany na to, ze robi to iste ako 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.
-
v případě, že adresář /root/.temp už existuje ... ukončí bash.
To asi ne, že... ::)
-
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á ...
-
Tak určitě... ::)
-
Tak určitě... ::)
A co ten exit 1? Ten je tam proč?
-
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.
-
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:
test -d /root/.temp || mkdir /root/.temp || exit 1
-
Děkuji a jaká je přesně rozdíl mezi tímto ?
test -d /root/.temp && mkdir /root/.temp
test -d /root/.temp || mkdir /root/.temp
-
Děkuji a jaká je přesně rozdíl mezi tímto ?
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í:
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.
-
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:
test -d /root/.temp; echo $?
test ! -d /root/.temp; echo $?
a pri pouziti && a ||:
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:
[[ -d /root/.temp ]] || mkdir /root/.temp || exit 1
-
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.
-
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.
-
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?
[[ -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.
-
A jaké to jsou ty "nekompatibilní prikazy" ?
-
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?
[[ -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.
-
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.
-
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.
-
Pokud skript začíná #!/bin/sh, tak by bashismy obsahovat neměl. Pokud začíná #!/bin/bash, tak ať si je klidně má.