Szukałem noop w bash (:), ale nie mogłem znaleźć żadnych dobrych informacji. Jaki jest dokładny cel lub przypadek użycia tego operatora?
Próbowałem śledzić i działa to tak dla mnie:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Daj mi znać, każdy przypadek użycia tego operatora w czasie rzeczywistym lub w dowolnym miejscu, w którym jest to obowiązkowe.
:
wbudowana istnieje w powłoce burne i ksh oraz bash.:
w tldp.org/LDP/abs/html/special-chars.htmlOdpowiedzi:
Jest tam więcej z powodów historycznych. Wbudowany dwukropek
:
jest dokładnie równoważny ztrue
. Jest to tradycyjne,true
gdy wartość zwracana jest ważna, na przykład w nieskończonej pętli:Jest to tradycyjne w użyciu,
:
gdy składnia powłoki wymaga polecenia, ale nie masz nic do roboty.Te
:
terminy wbudowane wszystkie drodze powrotnej do Thompson skorupy , to był obecny w Unix v6 .:
był wskaźnikiem etykiety dla stwierdzenia powłoki Thompsonagoto
. Etykieta może być dowolnym tekstem, więc:
podwojona jako wskaźnik komentarza (jeśli nie magoto comment
,: comment
to faktycznie komentarz). Bourne shell nie miałgoto
jednak utrzymane:
.Popularny idiom, który używa
:
is: ${var=VALUE}
, który ustawiavar
się,VALUE
jeśli był nieustawiony i nic nie robi, jeślivar
był już ustawiony. Konstrukcja ta istnieje tylko w postaci podstawiania zmiennych i to podstawianie zmiennych musi w jakiś sposób stanowić część polecenia: polecenie no-op dobrze służy.Zobacz także Czemu służy wbudowany dwukropek? .
źródło
#
do komentarzy (ani#!/bin/sh
szarpnięć);:
polecenia wprowadzone komentarze i biada naiwnego programisty, który dokonał pole piękny gwiazd w uwagach:: ****
(lub, co gorsza,: * * *
).: * * *
?:
jest to polecenie, powłoka nadal musi przetworzyć swoje argumenty, zanim odkryje, że:
je ignoruje. W większości przypadków po prostu zmuszasz powłokę do wykonania dodatkowej pracy przy rozszerzaniu*
listy plików w bieżącym katalogu; w rzeczywistości nie wpłynie to na sposób działania skryptu.set -e
na sobie. W każdym razie, miejmy nadzieję, że wszyscy zgodzimy się na użycie#
:)while : ; do ... ; done
jeśli chcę szybką i brudną nieskończoną pętlę. (Zwyklesleep
w pętli jest i naciskam Ctrl-C, aby go zabić.)Używam go do instrukcji if, kiedy komentuję cały kod. Na przykład masz test:
ale chcesz tymczasowo wykomentować wszystko zawarte w:
Co powoduje, że bash podaje błąd składniowy:
Bash nie może mieć pustych bloków (WTF). Więc dodajesz no-op:
lub możesz użyć opcji no-op, aby skomentować linie:
źródło
Jeśli używasz
set- e
to,|| :
jest to świetny sposób, aby nie wychodzić ze skryptu, jeśli wystąpi awaria (jawnie sprawia, że przechodzi).źródło
|| :
późniejsze skorzystanie z samodzielnej obsługi błędu za pomocą polecenia anexit 0
pozwoli wyświetlić wszystkie standardowe wyjścia i błędy w oknie aplikacji podczas debugowania. Zastanów się,{ foo ... 2>&1; } || :
co jest znacznie prostsze niż tworzenie bardziej złożonych pułapek i opcji „jeśli-to”.Możesz użyć
:
polecenia, które się powiedzie, ale nic nie zrobi. W tym przykładzie polecenie „gadatliwość” jest domyślnie wyłączone, ustawiając je na:
. Opcja „v” ją włącza.źródło
$(verbosity $i)
późniejszy (i warunkowo) nic nie robi.Ignorować
alias
argumentyCzasami chcesz mieć alias, który nie przyjmuje żadnego argumentu. Możesz to zrobić za pomocą
:
:źródło
:
niestety nie pokazuje, jak działa. Podany przykład wydaje się zbędny.#
#
spowodowałoby, że wszystko, co pojawia się syntaktycznie po tej samej linii, byłoby ignorowane. Jest to naprawdę inne (rozważmy_alias arg ; other_command
lub odwrotniemy_alias arg1 {BACKSLASH}{NEWLINE} arg2
) i prawdopodobnie nie jest tym, czego chcesz, ponieważ może powodować błędy składniowe (zgadnij, co zrobiwhile my_alias ; do true ; done
lubwhile true ; do my_alias ; done
zrobi).Jednym z zastosowań są komentarze wielowierszowe lub skomentowanie części kodu do celów testowych, używając go w połączeniu z plikiem tutaj.
Nie zapomnij użyć cudzysłowów
EOF
, aby żaden kod wewnątrz nie został oceniony, na przykład$(foo)
. To również może być warta używając intuicyjnego nazwę terminatora jakNOTES
,SCRATCHPAD
lubTODO
.źródło
Moje dwa.
Osadzaj komentarze POD
Całkiem fajna aplikacja
:
służy do osadzania komentarzy POD w skryptach bash , dzięki czemu strony podręcznika mogą być szybko generowane. Oczywiście można by ostatecznie przepisać cały skrypt w Perlu ;-)Powiązanie funkcji czasu wykonywania
Jest to rodzaj wzorca kodu dla funkcji wiążących w czasie wykonywania. Fi, miej funkcję debugowania, aby zrobić coś tylko wtedy, gdy jest ustawiona określona flaga:
Dostajesz:
źródło
Czasami klauzule no-op mogą sprawić, że kod będzie bardziej czytelny.
To może być kwestia opinii, ale oto przykład. Załóżmy, że utworzyłeś funkcję, która działa, biorąc dwie ścieżki uniksowe. Oblicza „ścieżkę zmiany” potrzebną do przejścia z jednej ścieżki do drugiej. Na swoją funkcję nakładasz ograniczenie, że obie ścieżki muszą zaczynać się od znaku „/” LUB oba nie mogą.
Niektórzy programiści będą chcieli usunąć opcję no-op, ale oznaczałoby to zanegowanie warunku:
Teraz - moim zdaniem - z klauzuli if nie wynika jasno warunki, w których chciałbyś pominąć wykonywanie funkcji. Aby wyeliminować no-op i zrobić to wyraźnie, chciałbyś usunąć klauzulę if z funkcji:
Wygląda to lepiej, ale wiele razy nie możemy tego zrobić; chcemy, aby sprawdzanie było wykonywane wewnątrz funkcji.
Jak często to się dzieje? Niezbyt często. Może raz lub dwa razy w roku. Dość często zdarza się, że warto być tego świadomym. Nie boję się go używać, gdy myślę, że poprawia czytelność mojego kodu (niezależnie od języka).
źródło
:
należy użyć:
, a nietrue
w odpowiedzi. Powiedział, że najprostszym sposobem, aby negować tutaj warunkowego jest użycie jednego[[ ... ]]
polecenia i poprzedzić go z!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
prawdopodobnie wygląda mniej niezręcznie niżtrue ${...=...}
. Niektórzy woląwhile :; do
teżwhile true; do
zwięzłość.Trochę związane z tą odpowiedzią , uważam, że ten nie-op raczej wygodny do hakowania skryptów poligloty . Na przykład, tutaj jest poprawny komentarz zarówno dla basha, jak i dla vimscript:
Jasne, mogliśmy
true
równie dobrze użyć , ale:
będąc znakiem interpunkcyjnym, a nie nieistotnym angielskim słowem, jasno widać, że jest to token składni.Jeśli chodzi o tego , dlaczego ktoś miałby zrobić tak trudną rzecz, jak napisanie skryptu poliglotowego (poza tym, że jest fajny): okazuje się pomocny w sytuacjach, w których normalnie pisalibyśmy kilka plików skryptów w kilku różnych językach, z plikiem
X
odnoszącym się do plikuY
.W takiej sytuacji połączenie obu skryptów w jednym pliku poliglotowym pozwala uniknąć pracy w
X
przy określaniu ścieżki doY
(po prostu"$0"
). Co ważniejsze, ułatwia to poruszanie się po programie lub jego dystrybucję.Typowy przykład.Istnieje dobrze znany od dawna problem z shebangiem: większość systemów (w tym Linux i Cygwin) zezwala na przekazanie tłumaczowi tylko jednego argumentu. Następujące shebang:
uruchomi następujące polecenie:
a nie zamierzone:
W rezultacie napisałbyś skrypt opakowujący, taki jak:
I tu na scenę wkracza poliglossia.
Bardziej konkretny przykład. Kiedyś napisałem skrypt basha, który między innymi wywołał Vima. Musiałem dać Vimowi dodatkową konfigurację, co można by zrobić za pomocą tej opcji
--cmd "arbitrary vimscript command here"
. Jednak ta konfiguracja była znaczna, więc umieszczenie jej w łańcuchu byłoby okropne (jeśli kiedykolwiek było to możliwe). Dlatego lepszym rozwiązaniem było zapisanie go w extenso w jakimś pliku konfiguracyjnym, a następnie zmusić Vima do odczytania tego pliku za pomocą-S "/path/to/file"
. W rezultacie otrzymałem plik polyglot bash / vimscript.źródło
Użyłem w nim również skryptów do definiowania domyślnych zmiennych.
źródło
załóżmy, że masz polecenie, które chcesz powiązać z sukcesem innego:
ale teraz chcesz wykonać polecenia warunkowo i chcesz wyświetlić polecenia, które zostaną wykonane (przebieg na sucho):
więc jeśli ustawisz DEBUG i NOEXEC, drugie polecenie nigdy się nie pojawi. dzieje się tak, ponieważ pierwsza komenda nigdy nie jest wykonywana (ponieważ NOEXEC nie jest pusty), ale ocena tego faktu pozostawia zwrot 1, co oznacza, że polecenie podrzędne nigdy nie jest wykonywane (ale chcesz, aby było to robione na sucho). więc aby to naprawić, możesz zresetować wartość wyjściową pozostawioną na stosie za pomocą noop:
źródło