Tvorba adresářů v bash skriptu

Jakub

Tvorba adresářů v bash skriptu
« kdy: 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
« Poslední změna: 03. 05. 2015, 20:48:16 od Petr Krčmář »


Re:Problém s příkazem v BASH
« Odpověď #1 kdy: 03. 05. 2015, 15:33:26 »
A co by s ním mělo být špatně?

black3r

Re:Problém s příkazem v BASH
« Odpověď #2 kdy: 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

Lol Phirae

Re:Problém s příkazem v BASH
« Odpověď #3 kdy: 03. 05. 2015, 16:23:54 »
Tu kravinu s 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

Re:Problém s příkazem v BASH
« Odpověď #4 kdy: 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.


Lol Phirae

Re:Problém s příkazem v BASH
« Odpověď #5 kdy: 03. 05. 2015, 16:28:36 »
v případě, že adresář /root/.temp už existuje ... ukončí bash.

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

Re:Problém s příkazem v BASH
« Odpověď #6 kdy: 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á ...

Lol Phirae

Re:Problém s příkazem v BASH
« Odpověď #7 kdy: 03. 05. 2015, 16:42:51 »
Tak určitě...  ::)

mhepp

Re:Problém s příkazem v BASH
« Odpověď #8 kdy: 03. 05. 2015, 18:09:10 »
Tak určitě...  ::)

A co ten exit 1? Ten je tam proč?

Jakub

Re:Problém s příkazem v BASH
« Odpověď #9 kdy: 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.

Re:Problém s příkazem v BASH
« Odpověď #10 kdy: 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

Jakub

Re:Problém s příkazem v BASH
« Odpověď #11 kdy: 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

Re:Problém s příkazem v BASH
« Odpověď #12 kdy: 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.

nobody

Re:Problém s příkazem v BASH
« Odpověď #13 kdy: 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

Jakub

Re:Problém s příkazem v BASH
« Odpověď #14 kdy: 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.