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 avar
value
állapotban marad:
visszatér, aztrue
eseté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
.