Ami egy idiótább egy bash forgatókönyvben: `|| igaz` vagy `|| : `?

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

  • Ez ' érdemes megjegyezni, hogy az ||: (szóköz nélkül) a bash-ban is érvényes. Ugyanazt csinálja, mint || : vagy || true.

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 a var value állapotban marad : visszatér, az true 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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük