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
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życieperldoc 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{|}~
CommentedOutBlock() { echo "test"; }