Rozważać
echo \ # this is a comment
foo
To daje:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Po kilku poszukiwaniach w Internecie znalazłem rozwiązanie firmy DigitalRoss na siostrzanej stronie Stack Overflow. Więc można to zrobić
echo `: this is a comment` \
foo
lub alternatywnie
echo $(: this is a comment) \
foo
Jednak DigitalRoss nie wyjaśnił, dlaczego te rozwiązania działają. Byłbym wdzięczny za wyjaśnienie. Odpowiedział komentarzem:
Kiedyś było
goto
polecenie powłoki, które rozgałęziało się na etykiety określone jak:
tutaj.goto
Zniknął, ale nadal można używać: whatever
składni ...:
jest rodzajem parsed komentarz teraz.
Chciałbym jednak więcej szczegółów i kontekstu, w tym omówienie przenośności.
Oczywiście, jeśli ktoś ma inne rozwiązania, to też byłoby dobrze.
Zobacz także wcześniejsze pytanie Jak komentować polecenia wieloliniowe w skryptach powłoki? .
Weź wiadomość do domu z dyskusji poniżej. To `: this is a comment`
tylko podstawienie polecenia. Wynikiem : this is a comment
jest nic, a to zostaje zastąpione `: this is a comment`
.
Lepszym wyborem jest:
echo `# this is a comment` \
foo
make_FIND
skrypt, który buduje długą listę argumentówfind
. Tutaj motywacja do budowania tego fragmentu po kawałku polega na tym, że każdy fragment pochodzi z korpusu pętli, ale ten sam styl pozwala komentować każdy fragment.Możesz to osiągnąć za pomocą tablic Bash, np
Definiuje tablicę
$CMD
, a następnie ją rozwija. Po rozwinięciu linia wynikowa jest oceniana, więc w tym przypadkuecho foo
jest wykonywana.Tekst pomiędzy
(
i)
definiuje tablicę i podlega zwykłej składni bash, więc wszystko w linii po#
jest ignorowane.Uwaga na temat zachowania cytowanych białych znaków
${CMD[@]}
rozwija się do pojedynczego łańcucha, który jest konkatenacją wszystkich elementów, oddzielonych spacją. Po rozwinięciu Bash następnie parsował łańcuch na tokeny w zwykły sposób (por. $ IFS ), co często nie jest tym, czego chcemy.Natomiast jeśli rozwinięcie jest zawinięte w podwójne cudzysłowy, tzn.
"${CMD[@]}"
Każdy element w tablicy zostaje zachowany. Rozważ różnicę międzyhello world second item
i"hello world" "second item"
.Obrazowy przykład:
źródło
${CMD[@]}
nie rozwija się do pojedynczego ciągu. - Rozwija się do wielu ciągów: nie tylko dla każdego elementu tablicy, ale także dla białych znaków w każdym elemencie. (Tj .: całkowicie bezużyteczne)Nie rób
$(: comment)
. To nie jest komentarz - to podpowłoka - kolejny zupełnie nowy proces powłoki dla większości powłok. Twoim celem jest zrobienie mniej w / w twój wkład, a nie więcej, co by to zrobił - nawet jeśli jest to bezcelowe.Możesz zamiast tego zrobić ...
Zasadniczo to, co się tam dzieje, polega na tym, że powłoka dokonuje substytucji. Za
$-
każdym razem zastępuje wartość specjalnego parametru powłoki . W każdym razie jest to krótki ciąg, ale zawsze jest ustawiony - a więc podstawienie wewnętrzne - które jest interpretowane jako wzór do usuwania z zewnętrznego - nie rozszerza się do treści między nawiasami, gdy używam-
formy rozwinięcia.Tutaj:
Widzieć? Więc jest tylko dwukrotnie rozszerzony. Gdy tylko powłoka odkryje, że parametr jest ustawiony, wszystko w opcjonalnym polu ekspansji jest odrzucane, i rozwija się do całej wartości, która jest usuwana z siebie, a więc do zera. W większości pocisków nie potrzebujesz nawet znaków ucieczki, ale
bash
wymaga tego.Jeszcze lepiej jest:
źródło