Jaki jest sens „zerowego” operatora w skrypcie BASH? Rozumiem, że jest używany jako symbol zastępczy po if
poleceniu, gdy nie masz nic do powiedzenia, ale potrzebujesz polecenia, aby program mógł działać poprawnie. Ale jakie jest do tego ogólne zastosowanie? Kiedy go użyjesz? Kiedy warto go używać?
13
Odpowiedzi:
Czasami przydatne jest umożliwienie wystąpienia efektów ubocznych rozszerzenia parametrów.
Na przykład ustawienie wartości domyślnej
źródło
:
poleceń i parametrów w podręczniku bash.${name:="John Doe"}
zostanie rozwinięty, powodując, że przypisanie nastąpi, ponieważ jest on odczytywany jako argument :. Bez: powłoka spróbuje uruchomić „John Doe” jako polecenie lub wartość,$name
jeśli jest już ustawionaMożesz go również użyć do niekończących się pętli:
źródło
while true
jest bardziej czytelny, ponieważ (a) używa mniejszej interpunkcji i (b) jest bardziej podobny do języków pochodnych C.Możesz go użyć do utworzenia pliku bez uruchamiania programu:
Jest to nieskończenie szybsze niż
touch /path/to/file
(ponieważ nie wymaga uruchamianiatouch
programu) i może być nieznacznie bardziej przenośne niż zwykłektóry wydaje się działać na wielu systemach. Podobnie można go użyć do sprawdzenia, czy masz dostęp do zapisu do pliku :
chociaż można to również ogólnie zrobić bez
:
. Ostrzeżenia:(Zobacz powiązane pytanie z przyczynami, dla których jest to bardziej wiarygodne niż
if [ -w /path/to/file ]
.)źródło
Dawno temu, w Unixie V6 i Thompson Shell,
:
faktycznie był używany jako częśćgoto
instrukcji. Zgodnie z instrukcją pierwotnie pojawił się w wersji 3 Uniksa:Obecnie
bash
jest używany jako operator no-op, powracający sukces. Rzeczywiście, jeśli spojrzysz na kod źródłowy , zobaczysz totrue
i:
użyjesz tej samej funkcjiint colon_builtin()
, poniżej. Nie ma:
wbudowanego polecenia, a/bin/true
właściwie jest dość dużym poleceniem do tego, co robi.:
może być używany w dowolnym miejscutrue
, na przykład wcommand_that_can_fail || true
, chociaż może to wprowadzić w błąd nie-ekspertów. Przeczytaj więcej na ten temat tutaj .źródło
Możesz go użyć w pozytywnym teście
if
polecenia, gdy chcesz tylko zrobić coś po ujemnej stronie. Na przykład:Bez
:
bash generowałby błąd składniowy.To jest uproszczony przykład. Zasadniczo użyłbyś takiej techniki we wstępnym kodowaniu, gdy jeszcze nie napisałeś tego segmentu kodu i potrzebujesz czegoś, co nie generuje błędu.
źródło
if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi
pokazywałoby błąd tylko wtedy, gdy Firefox nie był uruchomiony. Innymi słowy, gdy musisz coś zrobić tylko wtedy, gdy polecenie ma błąd. W pewnym sensie jest to równoważnepgrep firefox || echo "Firefox not running"
, choć bardziej czytelne i pozwala na większą liczbę poleceńWłaśnie użyłem go w skrypcie z poleceniami SSH, aby skrypt nie popełnił błędu.
W takim przypadku chcę sprawdzić, czy użytkownik może połączyć się z zestawem serwerów. Jeśli połączenie jest prawidłowe, zdalny host wyśle echo OK. Jeśli połączenie się nie powiedzie, SSH odpowie błędem. Jednak chcę, aby mój skrypt zakończył działanie z wartością 0, a nie wartością polecenia SSH, jeśli się nie powiedzie. Zasadniczo wychwytuję błąd SSH, ORingując go
||
poleceniem null:
. Wygląda tak:W ten sposób otrzymuję dane wyjściowe z SSH, ale nie kod błędu:
źródło