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
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ávarnastaven navaluepo: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
||:(bez mezery) platí také v bash. Dělá totéž jako|| :nebo|| true.