Nem csinálok rettenetesen sok shell parancsfájlt, ezért kissé meglepődtem, amikor a a git submodule dokumentációját, és láttam a szintaxist, amelyet ebben a dokumentációban használtak:
A Bármely almodulban lévő parancs nullától való visszatérése a feldolgozást leállítja. Ez felülírható a
|| :hozzáadásával a parancs végéhez.
Arra kellett gondolnom, hogy a || : gyorsírás volt-e a parancs sikeres kilépéshez való kényszerítéséhez. Bármikor sikeresen kellett kilépnem a parancsból , A || true fájlt használtam. A || : idiomatikusabbnak tekinthető?
Megjegyzések
Válasz
true nem épült be a Bourne-shellbe. A : mindig az volt (a # bevezetése előtt így lehetett megjegyzéseket írni).
Ez, és mert valószínűleg rövidebb a típus a fő oka annak, hogy az emberek a : -t részesítik előnyben az true helyett.
Vegye figyelembe még egy különbséget POSIX héjak (bash esetén, csak POSIX módban): míg az true egy szokásos beépített (nem is kell beépíteni) , : egy speciális beépített. Ennek néhány következménye van, amelyeknek valószínűleg nincs hatása az adott esetben:
-
Ha egy
:parancs meghiúsul, ideértve a sikertelen átirányítást is, ami a shell kijutását okozza. A gyakorlatban ez valószínűleg nem fog változtatni, hacsak nem adja át az átirányításokat a következőhöz::$ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE -
a
var=value :mezőben avarvalueállapotban marad:visszatér, aztrueesetén nem:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Ne feledje, hogy a || true a rc és a csh héjakban működik családok, de nem || : (de nem a set -e törléséhez a csh -ban).
|| : nem ugyanaz, mint a :. Ez azt jelenti, hogy vagy futtassa : különben (vagyis ha az előző folyamat meghibásodik).
set -e false
A héj kilépését okozná a set -e (más néven a errexit opció) és nem nulla (hiba) kilépési állapota van. A set -e effektus törlődik, ha a nullától eltérő kilépési állapotot visszaadó parancsot feltételként használják, például:
if false; then ... while false; do ... false && : ... false || : ...
false && : csak set -e -t töröl. A false || : megszünteti a (z) set -e hatását, és a kilépési állapotot 0 értékre állítja, tehát idiomatikusabb mondani, hogy figyelmen kívül akarjuk hagyni a parancs hibakimeneti kódját. A legtöbben azt állítják, hogy a || true olvashatóbb (egyértelműbben közvetíti a szándékot).
Megjegyzések
- A
&& :zseniális, van-e erről dokumentum vagy további olvasnivaló? A Google alulmúlja, hogy megpróbálok ilyen típusú kulcsszavakat találni …
Válasz
A legtöbb válasz nem sikerül foglalkozzon a : leggyakoribb használatával.
Először is, ez a beszélgetés nem kapcsolódik egyetlen olyan héjhoz sem, amely nem Bourne shell (sh) származék. Mindazonáltal az összes Bourne-származék héj ugyanazokat látja true és :. A programozókat korábban arra bíztatták, hogy : -t használjanak az true helyett, mert a : mindig beépített, míg régen előfordultak olyan esetek, amikor az true nem mindig volt beépített.
: két felhasználás. Ez nem a # szinonimája, de más funkcióval rendelkezik. Ha a szkriptet set -x alatt hibakeresik, akkor az elemző elveti azokat a sorokat, ahol # -t használnak, és teljesen figyelmen kívül hagyják, míg a : elemzik és kiértékelik. Ez nagyon hasznos a hibakeresésben, mivel a -x alatt ezek a sorok jelennek meg, és értékük az értékelés után megjelenik.Ez olyan, mintha print utasításokat helyeznénk a kódba, amelyek csak -x módban jelennek meg. Vigyázzon a : után található értékekkel, mivel ezek valós kódok, és a mellékhatások befolyásolhatják a programot.
Megjegyzések
- Mi a második felhasználás?
Válasz
Általában a bash-ban a kettőspont : és true egyenértékű.
Is | | : idiomatikusabbnak tekinthető?
Úgy gondolom, hogy a kontextuson alapszik .
Ha return value -t szeretne, vagy egy condition mindig igaz , használnia kell az true kulcsszót, ez egyértelműbbé teszi a kódot, és tudatja a nézőkkel, hogy hangsúlyozni szeretné a értéket true , azaz:
while true; do something
vagy
<commnad> RETURN_VALUE= $? || true
És ha nem akar semmit tenni , vagy NOP a shellben kettőspontot kell használni :
if condition then : # DO NOTHING HERE else do something fi
vagy
while conditon do : # DO NOTHING HERE done
||:(szóköz nélkül) a bash-ban is érvényes. Ugyanazt csinálja, mint|| :vagy|| true.