Co jest bardziej idiomatyczne w skrypcie bash: `|| prawda` lub `|| : `?


36

Nie robię strasznie dużo skryptów powłoki, więc byłem trochę zaskoczony, kiedy czytałem dokumentacjęgit submodule i zobaczyłem składnię, której używali w tej dokumentacji:

Niezerowy zwrot z polecenia w dowolnym podmodule powoduje zakończenie przetwarzania. Można to zmienić, dodając || :na końcu polecenia.

Musiałem spojrzeć w górę, co || :było skrótem od zmuszania polecenia do pomyślnego wyjścia. Za każdym razem, gdy musiałem pomyślnie zakończyć polecenie, użyłem || true. Czy jest || :uważany za bardziej idiomatyczny?


Warto zauważyć, że ||:(bez spacji) obowiązuje również w bash. Robi to samo co || :lub || true.
Bruno Bronosky

Odpowiedzi:


38

truenie został wbudowany w powłokę Bourne'a. :zawsze tak było (był to sposób wprowadzania komentarzy przed #wprowadzeniem).

To, a bo to krótsze typu jest prawdopodobnie głównym powodem ludzie wolą :się true.

Zauważ kolejną różnicę w powłokach POSIX (dla bash, tylko w trybie POSIX): chociaż truejest to zwykłe narzędzie wbudowane (nawet nie musi być wbudowane), :to jest ono narzędziem specjalnym . Ma to kilka implikacji, z których większość prawdopodobnie nie będzie miała żadnego wpływu w tym konkretnym przypadku:

  • Jeśli :polecenie nie powiedzie się, w tym z powodu nieudanego przekierowania, spowoduje to zamknięcie powłoki. W praktyce prawdopodobnie nie będzie to miało znaczenia, chyba że przekażesz przekierowania do:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • w var=value :, varpozostaje ustawiony na valuepo :powrocie, nie w przypadku true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

Zauważ też, że || truedziała w powłokach rci cshrodzin, ale nie || :(ale nie w celu anulowania set -ew csh).

|| :to nie to samo co :. Oznacza to lub działa w :inny sposób (to znaczy, jeśli poprzedni potok się nie powiedzie).

set -e
false

Spowodowałoby muszlę do zjazdu powodu set -ei falsema niezerową (awaria) stan wyjścia. set -eEfekt jest anulowana, jeśli polecenie, które zwraca kod wyjścia niż zero jest używany jako warunku jak w:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :tylko anuluje set -e. false || :anuluje set -ei ustawia status wyjścia na 0tak, więc bardziej idiomatyczne jest stwierdzenie, że chcemy zignorować kod wyjścia błędu polecenia. Większość twierdzi, że || truejest to bardziej czytelne (wyraźniej oddaje intencję).


5
&& :jest genialny, czy są jakieś dokumenty lub dalsze informacje na ten temat? Google nie odpowiada mi, gdy próbuję znaleźć tego rodzaju słowa kluczowe…
Ian Bytchek,

5

Na ogół, w bash, okrężnicy :i truejest równoważny.

Jest || : uważany za bardziej idiomatyczny?

Myślę, że jest to oparte na kontekście .

Jeśli chcesz return value, lub a conditionjest zawsze prawdziwe, powinieneś użyć truesłowa kluczowego, to uczyni twój kod jaśniejszym i poinformuje widzów, że chcesz podkreślić wartość true , tj .:

while true; do something

lub

<commnad>
RETURN_VALUE= $? || true

A jeśli nie chcesz nic robić lub NOPw skorupce, powinieneś użyć jelita grubego:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

lub

while conditon
do
    : # DO NOTHING HERE
done

5

Większość z tych odpowiedzi nie odnosi się do najczęściej używanych zastosowań :.

Po pierwsze, ta dyskusja nie jest związana z żadną powłoką, która nie jest pochodną powłoki Bourne'a ( sh). To powiedziawszy, wszystkie powłoki pochodne Bourne'a widzą truei :jako to samo. Programiści byli zachęcani do korzystania :zamiast true, ponieważ :zawsze jest wbudowany, podczas gdy zdarzały się przypadki, w których truenie zawsze był wbudowany.

:ma dwa zastosowania. Nie jest synonimem #, ale ma inną funkcję. Podczas debugowania skryptu pod a set -xlinie, w których #jest używany, są usuwane przez analizator składni i całkowicie ignorowane, podczas gdy linie z :są analizowane i analizowane. Jest to bardzo przydatne w debugowaniu, ponieważ pod -xtymi liniami są wyświetlane i ich wartość po ocenie. To tak, jakby wstawiać printdo kodu instrukcje, które wyświetlają się tylko w -xtrybie. Uważaj na wartości po, :ponieważ są one prawdziwym kodem, a skutki uboczne mogą wpłynąć na twój program.


1
Jakie jest drugie zastosowanie?
Peter Mortensen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.