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