Což je více idiomatické v bash skriptu: `|| true` nebo `|| :?

Nedělám strašně moc skriptů prostředí, takže mě trochu překvapilo, když jsem četl dokumentaci pro git submodule a viděl jsem syntaxi, kterou použili v této dokumentaci:

A nenulový návrat z příkazu v kterémkoli submodulu způsobí ukončení zpracování. To lze přepsat přidáním || : na konec příkazu.

Musel jsem vyhledat, že || : je zkratka pro vynucení úspěšného ukončení příkazu. Kdykoli jsem musel úspěšně provést příkaz , Použil jsem || true. Je || : považován za více idiomatický?

Komentáře

  • Je to ' Stojí za zmínku, že ||: (bez mezery) platí také v bash. Dělá totéž jako || : nebo || true.

Odpovědět

true nebyl zabudován do prostředí Bourne. : vždy byl (byl to způsob zadávání komentářů před zavedením #).

To a protože je kratší na psaní je pravděpodobně hlavní důvod, proč lidé preferují : před true.

Všimněte si dalšího rozdílu v POSIX skořápky (pro bash, pouze v režimu POSIX): zatímco true je běžný vestavěný (nemusí být vestavěný) , : je integrován speciální . To má několik důsledků, z nichž většina v tomto konkrétním případě pravděpodobně nebude mít žádný dopad:

  • Pokud příkaz : selže, včetně důvodu neúspěšného přesměrování, které způsobí ukončení shellu. V praxi to pravděpodobně nezmění, pokud nepředáte přesměrování na :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • v var=value : zůstává var nastaven na value po : se vrací, nikoli v případě true:

    $ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

Upozorňujeme, že || true funguje ve skořápkách rc a csh rodiny, ale ne || : (ale nezrušit set -e v csh).

|| : není totéž jako :. Znamená to nebo spustit : jinak (tj. pokud předchozí kanál selže).

set -e false 

Způsobí ukončení shellu z důvodu set -e (aka možnost errexit) a má nenulový (chybový) stav ukončení. Efekt set -e je zrušen, pokud je příkaz, který vrací nenulový stav ukončení, použit jako podmínka jako v:

if false; then ... while false; do ... false && : ... false || : ... 

false && : zruší pouze set -e. false || : zruší účinek set -e a nastaví stav ukončení na 0, takže je idiomatičtější říci, že chceme ignorovat kód ukončení selhání příkazu. Většina by tvrdila, že || true je čitelnější (jasněji vyjadřuje záměr).

Komentáře

  • && : je brilantní, existují nějaké dokumenty nebo další informace o tom? Google mi nedokáží najít tento druh klíčových slov…

Odpovědět

Většina z těchto odpovědí selže řeší nejčastější použití :.

Za prvé, tato diskuse nesouvisí s žádným shellem, který není Derivát Bourne shell (sh). To znamená, že všechny Bourneovy derivační skořápky vidí true a : to samé. Programátorům se dříve doporučovalo, aby místo true používali :, protože : je vždy vestavěný, i když dříve existovaly případy, kdy true nebyl vždy vestavěný.

: má dvě použití. Není to synonymum pro #, ale má jinou funkci. Při ladění skriptu pod set -x jsou řádky, kde se používá #, analyzátorem vynechány a zcela ignorovány, zatímco řádky s : jsou analyzovány a vyhodnoceny. To je opravdu užitečné při ladění, protože pod -x se tyto řádky zobrazují a zobrazuje se jejich hodnota po vyhodnocení.Je to jako vkládat do kódu print příkazy, které se zobrazují pouze v režimu -x. S hodnotami za : buďte opatrní, protože se jedná o skutečný kód a vedlejší účinky mohou ovlivnit váš program.

Komentáře

  • Jaké je druhé použití?

Odpověď

Obecně platí, že v bash dvojtečka : a true jsou ekvivalentní.

Je | | : považováno za idiomatičtější?

Myslím, že je založen na kontextu .

Pokud chcete return value nebo condition vždy platí , měli byste použít klíčové slovo true, díky němu bude váš kód jasnější a diváci budou vědět, že chcete zdůraznit hodnotu true , tj .:

while true; do something 

nebo

<commnad> RETURN_VALUE= $? || true 

A pokud chcete nedělat nic nebo NOP ve skořápce byste měli použít dvojtečku :

if condition then : # DO NOTHING HERE else do something fi 

nebo

while conditon do : # DO NOTHING HERE done 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *