2014-04-01 20 views
5

Studiuję skrypty init System V znalezione w /etc/init.d/ w bieżącym wydaniu Debiana 7.4.0 wheezy (ale jest również obecne w innych, poprzednich wydaniach). Prawie wszystkie z nich (z istniejących usług) znajdujące się w tym folderze kończą się, w zasadzie pustą linią zawierającą tylko znak dwukropka (:). Nawet szkieletowy plik szablonu, który można tam znaleźć, w celu pisania własnych skryptów startowych, ma to. Oto kopiuj/wklej z końca kodu:Skrypt powłoki kończący się linią zawierającą tylko dwukropek?

esac 

: 

(to był koniec instrukcji case i to nie jest koniec pliku)

Co ciekawe nie jest to, że nie ma wyjścia 0 lub kończy się $? zadzwonić, z wyjątkiem tylko niektórych warunków w instrukcji sprawy, które zostałyby nazwane inaczej, więc wydaje się, że ten znak dwukropka jest swego rodzaju zamiennikiem? Pełny kod pliku szkieletu znajduje się tutaj: https://gist.github.com/ivankovacevic/9917139

Co to może być ten dwukropek i dlaczego?

+4

':' to wbudowane, które ocenia się 'true' w bash, więc podejrzewam, że to jest zresetowanie' $ '0. –

Odpowiedz

4

Okrężnica jest elementem składniowym, który zasadniczo nic nie robi, ale zwraca wartość true. Można go używać wszędzie tam, gdzie można użyć polecenia.

Czasami jest to potrzebne, gdy sh (1) wymaga instrukcji. Na przykład, to daje błąd:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    # echo yes 
else 
    echo no 
fi 

bash: błąd składni w pobliżu Nieoczekiwany token `innego”

Wymiana komentarz z: sprawia, że ​​praca:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    : echo yes 
else 
    echo no 
fi 

To jest rzadko potrzebne do jawnie użyj "wyjścia 0" w powłoce; w przypadku braku instrukcji wyjścia, skrypt powłoki wypływa ze statusem ostatnim poleceniu skrypt powłoki, który właśnie wykonuje

/bin/false 

dadzą status wyjścia 1:

$ echo $? 
1 

okrężnicy w dużej mierze czarna magia i dowiedziałem się tego, co wiem na ten temat z eksperymentów.

+1

dlaczego nie? wywołaj wyjście 0 na końcu skryptu, zamiast wkręcać umysł ludzi za pomocą: ...Czy jest jakaś prawdziwa korzyść z używania dwukropka nad wyjściem 0 –

+1

Zgadzam się @Ivan Kovacevic: czytelność jest poprawiona przez bycie jednoznacznym na temat wartości wyjściowej, więc zawsze piszę "exit 0", kiedy potrzebuję skryptu do zwrócenia statusu sukcesu. Powiedziawszy to, należy używać tylko "wyjścia 0", gdy faktycznie chcemy nadpisać status błędu, ponieważ powody stanu błędu są tam z jakiegoś powodu. – BertD

+1

Dwukropek ma jedną sporną korzyść: tworzy kod wyjścia równy 0 bez konieczności wybierania pomiędzy 'exit' i' return' (użyteczne, jeśli skrypt może być wykonywany * lub * pozyskiwany; wyjście z pliku źródłowego jest mało prawdopodobne być pożądanym i 'return'ing ze skryptu jest błędem). W dzisiejszych czasach bardziej czytelne "prawdziwe" powinno być dostępne zamiast "archaicznego": w tym celu. – chepner

1

: zwraca status prawdziwy w BASH i jest tylko zamiennikiem słowa true. Nie widzę żadnej korzyści z używania : jako aplikacji na exit 0 na końcu skryptu inicjalizacyjnego systemu, niż zapisywanie znaków lub uczynienie go mniej czytelnym.

Jako chepner punkt na zewnątrz, : zapewniłby prawdziwy status bez wychodzenia z powłoki, jeśli pochodzi ze skryptu.

Jest również powszechnie stosowany do zastępowania logicznej negacji za pomocą instrukcji !.

if [[ $var ]]; then 
    : 
else 
    echo no 
fi 

jest taka sama jak:

if ! [[ $var ]]; then 
    echo no 
fi 
+1

Jeśli skrypt może (lub musi) pochodzić, 'exit 0' zakończy powłokę pochodzącą ze skryptu, a nie tylko skrypt. – chepner