Komentarze do skryptu powłoki wielowierszowej – jak to działa?

Niedawno natknąłem się na wielowierszowy komentarz, którego nigdy wcześniej nie widziałem – oto przykład skryptu:

echo a # : aaa : ddd # echo b 

Wydaje się, że to działa, nawet vim składnia-podkreśla to. Jak nazywa się ten styl komentowania i jak znaleźć więcej informacji na jego temat?

Komentarze

  • A co, jeśli zamiast tego opakujesz swój kod w funkcję skomentować to? CommentedOutBlock() { echo "test"; }
  • Jak wspominali inni, komentarze wielowierszowe nie są dostępne natywnie. Więc używam if false; następnie < ile kiedykolwiek chcesz wierszy > fi

Odpowiedź

To nie jest komentarz wielowierszowy. # to komentarz w jednym wierszu. : (dwukropek) nie jest w ogóle komentarzem, ale raczej wbudowanym poleceniem powłoki, które jest w zasadzie NOP , operacja zerowa, która nic nie robi poza zwracaniem prawdy, na przykład true (a tym samym ustawienie $? na 0 jako efekt uboczny). Jednak ponieważ jest to polecenie, może przyjmować argumenty, a ponieważ ignoruje swoje argumenty, w większości przypadków działa powierzchownie jak komentarz. Głównym problemem związanym z tym bałaganem jest to, że argumenty są wciąż rozszerzone, co prowadzi do wielu niezamierzonych konsekwencji. Na argumenty nadal mają wpływ błędy składniowe, przekierowania są nadal wykonywane, więc : > file spowoduje obcięcie file i : $(dangerous command) podstawienia nadal będą działać.

Najmniej zaskakujący, całkowicie bezpieczny sposób wstawiania komentarzy do skryptów powłoki to #. Trzymaj się tego nawet w przypadku komentarzy wielowierszowych. Nigdy nie próbuj (ab) używać : do komentarzy. W powłoce nie ma dedykowanego mechanizmu komentowania wielowierszowego, który byłby analogiczny do formy z ukośnikiem /* */ w C językach.


Ze względu na kompletność, ale nie dlatego, że jest to zalecana praktyka, wspomnę, że można użyć here-documents aby robić wielowierszowe „komentarze”:

: <<"end_long_comment" This is an abuse of the null command ":" and the here-document syntax to achieve a "multi-line comment". According to the POSIX spec linked above, if any character in the delimiter word ("end_long_comment" in this case) above is quoted, the here-document will not be expanded in any way. This is **critical**, as failing to quote the "end_long_comment" will result in the problems with unintended expansions described above. All of this text in this here-doc goes to the standard input of :, which does nothing with it, hence the effect is like a comment. There is very little point to doing this besides throwing people off. Just use "#". end_long_comment 

Komentarze

  • +1 bardzo ważne dla zachowaj pojedyncze cudzysłowy w wierszu << – to wyłącza podstawianie i rozwijanie.
  • I jako dodatkowa uwaga, wypełnianie skryptów powłoki tagiem dla rzeczy, które powinny być komentarzami, spowoduje dodatkowe zużycie pamięci RAM / procesora. Wygrał ' nie dotyczy prostych rzeczy na pulpicie, ale jeśli ' jest wykonywany setki lub tysiące razy na sekundę, ' ll nic nie robić, bardzo szybko .
  • @bahamat: jeśli wykonasz coś setki lub tysiące razy na sekundę, mam nadzieję, że wygrałeś ' t napisz to w powłoce … = /
  • Czasami używając narzędzia zerowego dla wielu wierszy tekst może być przydatny. Rozpoczynanie komentarza od : <<=cut umożliwia zapisywanie POD w skryptach powłoki, zobacz ten przykład po szczegóły . Umożliwia to użycie perldoc script.sh. Jednak wielowierszowy komentarz pokazany w tej odpowiedzi jest czymś, co zdecydowanie powinno być blokiem komentarza (każda linia zaczyna się od # ).
  • Tutaj ' to przyjemna dyskusja na temat heredoców, używana zarówno do komentarzy, jak i innych interesujących przypadków użycia (nawet w tym do generowania skryptów dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Odpowiedź

To nie jest dowolny styl komentowania. wbudowane polecenie : nie robi absolutnie nic; nadużywa się go do komentowania.

$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

Odpowiedź

We wczesnych powłokach dwukropek był jedynym sposobem tworzenia komentarzy.

Jednak nie jest to prawdziwy komentarz, ponieważ wiersz jest analizowany dokładnie w taki sam sposób, jak każde inne polecenie, co może mieć skutki uboczne. Na przykład:

: ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

(Czasami dwukropek jest używany wyłącznie w celu wywołania tych skutków ubocznych, ale wtedy nie jest używany jako komentarz).

Czasami wygodnie jest użyć dwukropka, aby skomentować sekcję skryptu:

: " while [ "$n" -ne "$x" ] do : whatever done " 

To znacznie oszczędza czas wiersz z #, zwłaszcza jeśli komentowanie jest tylko tymczasowe.

Komentarze

  • Ten pojedynczy metoda komentowania cytatów nie ' nie działa na żadnej sekcji skryptu, która sama używa apostrofów.A jeśli używasz cudzysłowów w przybliżeniu tak często, jak powinieneś, oznacza to, że ' będziesz mieć uzasadnione pojedyncze cudzysłowy posypane w całym skrypcie. O wiele prostsze jest po prostu użycie dowolnego przyzwoitego edytora, który umożliwia blokowanie komentarzy w liniach.
  • Masz całkowitą rację, że zadziała tylko wtedy, gdy w cytowanej sekcji nie ma pojedynczych cudzysłowów. Jednak skrypt nie musi zawierać wielu pojedynczych cudzysłowów. Przeglądając kilka moich skryptów, stwierdzam, że są one stosunkowo rzadkie, a wiele z nich można zastąpić podwójnymi cudzysłowami.
  • Na wybór pojedynczego lub podwójnego cudzysłowu nie powinno mieć wpływu coś tak trywialnego i nieistotnego obawy, czy tekst skryptu sam w sobie jest prawidłowym ciągiem w apostrofach. Pojedyncze cudzysłowy służą do zapobiegania ekspansjom, podczas gdy podwójne cudzysłowy pozwalają na pewne rozszerzenia i wymagają dodatkowej analizy. To są prawdziwe kryteria decydujące o tym, którego użyć.
  • To zdecydowanie najmodniejszy sposób na zrobienie tego. Świetne dla małych bloków dokumentacji. Podoba mi się to bardziej niż /* */ i ugh, nie ' nie daj mi zacząć <!-- --> !

Odpowiedz

Jeśli Twój komentarz znajduje się na końcu skryptu, możesz to zrobić w następujący sposób:

#!/bin/sh echo "hello world" exec true we can put whatever we want here \"\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ abcdefghijklmnopqrstuvwxyz{|}~ 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *