Blokuj komentarze w skrypcie powłoki

250

Czy istnieje prosty sposób skomentowania bloku kodu w skrypcie powłoki?

theycallmemorty
źródło
2
Ciekawe, jak takie proste i proste pytanie ma zbyt różne i skomplikowane odpowiedzi.
Sigur

Odpowiedzi:

348

W bash:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

'I 'wokół ENDseparatora są ważne, inaczej rzeczy wewnątrz bloku jak na przykład $(command)zostanie rozpoznany i wykonany.

Aby uzyskać wyjaśnienie, zobacz to i to pytanie.

słoneczny256
źródło
24
Fajna sztuczka - pod warunkiem, że słowo kluczowe „KONIEC” (które oczywiście wybiera użytkownik) nie pojawia się w wierszu samodzielnie w materiale do skomentowania.
Jonathan Leffler
9
@kalengi: Tak; słowo użyte w cytatach może być dowolne; EOFjest klasycznym przykładem (i tak jest !, wykrzyknik na własną rękę), ale można użyć SNURFLE_BURGERSalbo classical_end_markerani żadnego innego słowa, które nie pojawiają się na linii na własną rękę w zakomentowanych materiału. Byłbym obrzydliwy w eksperymentowaniu ze spacjami itp., Ale słowo to równie dobrze może z nimi współpracować.
Jonathan Leffler
4
To na pewno działa, ale czy ktoś może wyjaśnić, jak to działa? Dzięki
mbbce
5
@MB_CE, patrz stackoverflow.com/questions/32126653/… . To powiedziawszy - uruchamia polecenie ( :), które nie odczytuje danych wejściowych i zawsze kończy działanie z udaną wartością, i wysyła „komentarz” jako dane wejściowe. Niewiele.
Charles Duffy,
2
Uważam za niewiarygodnie brzydkie i mylące pisanie aktywnego kodu w celu stworzenia kodu pasywnego ... po prostu użyj dobrego starego trybu wyboru bloku i naciśnij #; jaki jest z tym duży problem?
Rusty75
90

Nie ma komentarza blokowego do skryptu powłoki.

Używając vi(tak, vi) możesz łatwo komentować od linii n do m

<ESC>
:10,100s/^/#/

(który brzmi: od linii 10 do 100 zamień początek linii (^) znakiem #).

i un komentarz z

<ESC>
:10,100s/^#//

(który brzmi: od linii 10 do 100 początek linii zastępczej (^), po której następuje # z zaznaczeniem //.)

vijest prawie uniwersalny wszędzie tam, gdzie jest /bin/sh.

OscarRyz
źródło
Fajna sztuczka z wyrażeniem regularnym na vi, aby umieścić # przed wierszami.
Atiq Rahman
5
Tylko wskazówka - jeśli używasz vima, a to kończy podświetlanie początku każdej linii, dodaj |nohdo końca. Rura oddziela dodatkowe polecenia i nohnie nadaje się do podświetlenia. Podświetlanie wyszukiwanego terminu zostanie automatycznie wznowione przy następnym wyszukiwaniu czegoś. Przykład::10,100s/^/#/g|noh
Matthew
Potrzebuję tego do zautomatyzowania ze skryptu. Czy istnieje sposób, aby to zrobić dla pliku z vi bez potrzeby interakcji człowieka?
Timothy Swan
1
@TimothySwan Wyobrażam sobie, że program gawk lub sed mógłby to zrobić ... jakoś.
BeowulfNode42
mój preferowany sposób komentowania (lub prefiksowania) bloku za pomocą vi: przejdź do początku linii, którą chcesz rozpocząć komentowanie (np. <SHIFT>+G 10 <ENTER>wtedy 0lub w inny sposób, aby nawigować). Następnie użyj, <CTRL>+Vaby przejść do trybu blokowania wizualnego i wyróżnić początek wszystkich linii, które chcesz skomentować (w tym przykładzie 90 J). Następnie naciśnij, SHIFT+Iaby wstawić przed podświetlonym blokiem. Wpisz znak komentarza (np. #) I naciśnij, <ESC>aby zakończyć prefiks. Wyjaśnienie to brzmi bardzo długo, ale z mojego doświadczenia wynika, że ​​w praktyce jest ono znacznie szybsze.
Ueffes,
52

Możesz użyć:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi
dannyhan12
źródło
14
Jest to klasyczne, ale jak zauważa stackoverflow.com/a/19409316/832230 , po prostu if [ ];działa.
Acumenus
12
Może jaśniej: if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune
3
Wydaje się, że działa to tylko tak, że skomentowany tekst jest w rzeczywistości kodem. Mam problemy z komentarzami do potoków i średników. Odpowiedź Sunny256 zadziałała.
swdev
jeszcze bardziej zwięzłe byłoby []; za pomocą testu, który jest
Justin Duncan
27

Poniższa powinien pracować sh, bash, kshi zsh.

Bloki kodu, które mają zostać skomentowane, można umieścić w środku BEGINCOMMENTi ENDCOMMENT:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"

BEGINCOMMENT
  echo "This line appears in a commented block"
  echo "And this one too!"
ENDCOMMENT

echo "This is outside the commented block"

Wykonanie powyższego kodu spowoduje:

This is outside the commented block

Aby odkomentować bloki kodu skomentowane, powiedzmy

alias BEGINCOMMENT="if : ; then"

zamiast

alias BEGINCOMMENT="if [ ]; then"

w powyższym przykładzie.

diabelnie
źródło
23

jeśli potrafisz uniknąć pojedynczych cudzysłowów:

__='
blah blah comment.
'
vanvliet.eric
źródło
Lubię to. Co jednak oznacza podwójny znak podkreślenia? Jak najlepiej mogę powiedzieć, że jest to tylko zmienna nazwa, zgodnie z konwencją, że powinna być traktowana jako prywatna?
chessofnerd
Zapewnia także podświetlanie składni w większości edytorów i można je wywołać w razie potrzeby za pomocą $ __, chociaż dla jasności sugerowałbym nazwę zmiennej, taką jak dokumentacja lub dokumenty.
jasonleonhard
Możesz także dodać słowo lokalne z przodu ref
jasonleonhard
To powinna być najlepsza odpowiedź. Po prostu umieść fałszywą nazwę zmiennej zamiast podwójnego podkreślenia
B Abali,
Próbowałem tego, ale nie powiodło się, ponieważ było -F ';' wewnątrz bloku, aby skomentować.
yO_
15

Użyj, : 'aby otworzyć i 'zamknąć.

Na przykład:

: '
This is a
very neat comment
in bash
'

To jest przykład Vegas tutaj

Względny 0
źródło
2
hack-ish, ale super
Gergely Lukacsy
to jest dla mnie najlepszy.
DPalharini
14

W Vimie:

  1. przejdź do pierwszego wiersza bloku, który chcesz skomentować
  2. shift-V (wejdź w tryb wizualny), w górę w dół zaznacz linie w bloku
  3. po wybraniu wykonaj następujące czynności :s/^/#/
  4. polecenie będzie wyglądać następująco:

      :'<,'>s/^/#
  5. wciśnij Enter

na przykład

shift-V
jjj
:s/^/#
<enter>
stefanB
źródło
7
Aby anulować komentarz, użyj:s/^#/
Buge
Sprawdź odpowiedź @ horta: stackoverflow.com/a/28376319/3506015 - jest jeszcze mniej naciśnięć klawiszy!
geedoubleya
4

Możesz użyć trybu Visual Block Vi / Vima, który jest przeznaczony do takich rzeczy:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  

Odkomentowanie to:

Ctrl-V  
Highlight #'s  
d  
l  

Jest to interaktywny sposób vi wykonywania tego rodzaju rzeczy, zamiast liczenia lub odczytywania numerów linii.

Wreszcie, w Gvim używasz ctrl-q, aby przejść do trybu Visual Block, a nie ctrl-v (ponieważ jest to skrót do wklejania).

horta
źródło
Uwielbiam tę uproszczoną metodę. : o)
geedoubleya
4

Szczerze mówiąc, dlaczego tak dużo nadinżynierii ...

Uważam, że pisanie aktywnego kodu do generowania kodu pasywnego jest złą praktyką.

Moje rozwiązanie: większość redaktorów ma tryb wyboru bloku. Po prostu użyj go, aby dodać # do wszystkich linii, które chcesz skomentować. O co tyle szumu...

Przykład Notatnika:

Aby utworzyć: Alt - przesunięcie w dół, naciśnij #.

Aby usunąć: Alt-mousedrag w dół, strzałka Shift-prawa, usuń.

Zardzewiały75
źródło
8
Użytkownik najprawdopodobniej jest w terminalu. Nie można założyć środowiska myszy.
Gary
Czy nadal istnieją? Zwykle edytuję w trybie graficznym i wklejam ponownie za pomocą vi, co byłoby łatwym obejściem.
Rusty75
2

Wariacją sztuczki tutaj-doc w zaakceptowanej odpowiedzi przez sunny256 jest użycie słów kluczowych Perl do komentowania. Jeśli twoje komentarze są w rzeczywistości dokumentacją, możesz zacząć korzystać ze składni Perla wewnątrz skomentowanego bloku, co pozwala wydrukować go ładnie sformatowanego, przekonwertować na stronę podręcznika itp.

O ile powłoka jest zaniepokojony, trzeba tylko zamienić 'END'z '=cut'.

echo "before comment"
: <<'=cut'
=pod

=head1 NAME
   podtest.sh - Example shell script with embedded POD documentation

etc.

=cut
echo "after comment"

(Znaleziono w „ Osadzanie dokumentacji w skrypcie powłoki ”)

mivk
źródło
0

Innym trybem jest: jeśli Twój komentarz edytora NIE MA BLOKU komentarza,

  1. Otwórz drugie wystąpienie edytora (na przykład Plik => Nowy plik ...)
  2. Z POPRZEDNIEGO pliku, nad którym pracujesz, wybierz TYLKO CZĘŚĆ, KTÓRA CHCESZ KOMENTARZA
  3. Skopiuj i wklej go w oknie nowego pliku tymczasowego ...
  4. Otwórz menu Edycja, wybierz WYMIEŃ i wprowadź jako ciąg znaków do zastąpienia „\ n”
  5. wprowadź jako zamień ciąg: '\ n #'
  6. naciśnij przycisk „zamień WSZYSTKO”

GOTOWE

Działa z DOWOLNYM edytorem

Mardocheo
źródło
0

Lubię jedną linię otwierającą i zamykającą:

if [ ]; then ##
    ...
    ...
fi; ##

„##” pomaga mi łatwo znaleźć początek i koniec komentarza do bloku. Mogę nakleić cyfrę po „##”, jeśli mam ich kilka. Aby wyłączyć komentarz, po prostu wstawiam „1” w „[]”. Unikam też niektórych problemów z pojedynczymi cudzysłowami w komentarzowym bloku.

Ynnub
źródło