Blocco dei commenti in uno script di shell


250

Esiste un modo semplice per commentare un blocco di codice in uno script di shell?


2
Interessante come una domanda così facile e semplice abbia risposte troppo diverse e complicate.
Sigur,

Risposte:


348

In bash:

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

Il delimitatore 'e 'intorno ENDsono importanti, altrimenti le cose all'interno del blocco come ad esempio $(command)verranno analizzate ed eseguite.

Per una spiegazione, vedi questa e questa domanda.


24
Simpatico trucco - fintanto che la parola chiave 'END' (che è, ovviamente, scelta dall'utente) non appare su una riga da sola all'interno del materiale da commentare.
Jonathan Leffler,

9
@kalengi: Sì; la parola usata tra virgolette può essere qualcosa di conveniente; EOFè un classico esempio (e così è !, un punto esclamativo da solo), ma potresti usare SNURFLE_BURGERSo classical_end_markero qualsiasi altra parola che non appare su una riga da sola nel materiale commentato. Sarei schifoso di sperimentare spazi, ecc., Ma la parola potrebbe benissimo funzionare anche con loro.
Jonathan Leffler,

4
Funziona sicuramente ma qualcuno può approfondire come funziona? Grazie
mbbce

5
@MB_CE, vedi stackoverflow.com/questions/32126653/... . Detto questo, sta eseguendo un comando ( :) che non legge il suo input e esce sempre con un valore positivo e invia il "commento" come input. Non molto.
Charles Duffy,

2
Considero incredibilmente brutto e confuso scrivere codice attivo per creare codice passivo ... basta usare la buona vecchia modalità di selezione dei blocchi e premere #; qual è il grosso problema con quello?
Rusty75,

90

Non ci sono commenti di blocco sullo script della shell.

Usando vi(sì, vi) puoi facilmente commentare dalla riga n alla m

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

(che legge, dalla riga 10 a 100 la riga sostitutiva inizia (^) con un segno #).

e un commento con

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

(che recita, dalla riga 10 a 100 riga sostitutiva inizio (^) seguita da # con annotazione //.)

viè quasi universale ovunque ci sia /bin/sh.


Bel trucco con espressione regolare su vi per posizionare # davanti alle linee.
Atiq Rahman

5
Solo un suggerimento: se stai usando vim e questo finisce per evidenziare l'inizio di ogni riga, aggiungi |nohalla fine. La pipe separa i comandi aggiuntivi ed nohè per nessuna luce. L'evidenziazione dei termini di ricerca riprenderà automaticamente alla successiva ricerca di qualcosa. Esempio::10,100s/^/#/g|noh
Matteo

Ho bisogno che questo sia automatizzato da una sceneggiatura. C'è un modo per farlo su un file con vi senza bisogno dell'interazione umana?
Timothy Swan,

1
@TimothySwan Immagino che il programma gawk o sed potrebbe farlo ... in qualche modo.
BeowulfNode42,

il mio modo preferito di commentare (o anteponendo) un blocco con VI: raggiungere l'inizio della linea che si desidera avviare commentare (ad esempio, <SHIFT>+G 10 <ENTER>poi 0o da qualsiasi altro modo per navigare). Quindi utilizzare <CTRL>+Vper accedere alla modalità blocco visivo ed evidenziare l'inizio di tutte le righe che si desidera commentare (in questo esempio 90 J). Quindi premere SHIFT+Iper inserire prima del blocco evidenziato. Immettere il segno del commento (ad es. #) E premere <ESC>per terminare il prefisso. Questa spiegazione sembra molto lunga, ma nella mia esperienza è molto più veloce in pratica.
Ueffes

52

Puoi usare:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi

14
Questo è classico, ma come stackoverflow.com/a/19409316/832230 note, funziona altrettanto bene if [ ];.
Acumenus,

12

3
Questo sembra funzionare solo se il testo commentato è in realtà un codice. Riscontro problemi con i commenti con pipe e punti e virgola. Sunny256 risposta ha funzionato.
swdev,

ancora più conciso sarebbe []; usando il test che è
Justin Duncan il

27

Il seguente dovrebbe funzionare per sh, bash, kshe zsh.

I blocchi di codice da commentare possono essere inseriti BEGINCOMMENTe 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"

L'esecuzione del codice precedente comporterebbe:

This is outside the commented block

Per decommentare i blocchi di codice così commentati, diciamo

alias BEGINCOMMENT="if : ; then"

invece di

alias BEGINCOMMENT="if [ ]; then"

nell'esempio sopra.


23

se riesci a schivare le virgolette singole:

__='
blah blah comment.
'

Mi piace questo. Cosa significa però il doppio trattino basso? Per quanto posso dire, è solo un nome variabile che usa la convenzione che dovrebbe essere trattato come privato?
chessofnerd,

Fornisce inoltre l'evidenziazione della sintassi nella maggior parte degli editor ed è richiamabile, se necessario, con $ __ sebbene suggerirei un nome di variabile come documentazione o documenti per chiarezza.
Jasonleonhard,

Puoi anche aggiungere qui la parola locale davanti ref
jasonleonhard

Questa dovrebbe essere la risposta migliore. Basta inserire un nome variabile fittizio anziché il doppio trattino basso
B Abali

Ho provato questo, ma fallito perché c'era un -F ';' all'interno del blocco per commentare.
yO_


14

In Vim:

  1. vai alla prima riga del blocco che vuoi commentare
  2. shift-V (entra in modalità visiva), su in giù le linee di evidenziazione in blocco
  3. eseguire quanto segue alla selezione :s/^/#/
  4. il comando sarà simile al seguente:

      :'<,'>s/^/#
  5. premi invio

per esempio

shift-V
jjj
:s/^/#
<enter>

7
Ad uso rimuovere il commento:s/^#/
Buge

Controlla la risposta di @horta : stackoverflow.com/a/28376319/3506015 - ci sono ancora meno pressioni dei tasti!
geedoubleya,

4

Puoi usare la modalità Visual Block di Vi / Vim che è progettata per cose come questa:

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

Uncomment sarebbe:

Ctrl-V  
Highlight #'s  
d  
l  

Questo è il modo interattivo di vi di fare questo genere di cose piuttosto che contare o leggere i numeri di riga.

Infine, in Gvim usi ctrl-q per entrare in modalità Visual Block piuttosto che ctrl-v (perché questa è la scorciatoia per incollare).


Adoro questo metodo semplicistico. : o)
geedoubleya,

4

In tutta onestà, perché tanta ingegnerizzazione ...

Ritengo davvero una cattiva pratica scrivere codice attivo per generare codice passivo.

La mia soluzione: la maggior parte degli editor ha la modalità di selezione blocco. Basta usarlo per aggiungere # a tutte le righe che si desidera commentare. Qual è il grosso problema ...

Esempio di blocco note:

Per creare: Alt - mousedrag down, premere #.

Per eliminare: Alt-mousedrag in basso, Maiusc-freccia destra, Elimina.


8
L'utente molto probabilmente è nel terminale. Impossibile assumere un ambiente del mouse.
Gary,

Esistono ancora? Di solito modifico in modalità grafica e ricollego usando vi, sarebbe una soluzione semplice.
Rusty75,

2

Una variante del trucco here-doc nella risposta accettata da sunny256 è l'uso delle parole chiave Perl per i commenti. Se i tuoi commenti sono in realtà una sorta di documentazione, puoi quindi iniziare a utilizzare la sintassi Perl all'interno del blocco commentato, che ti consente di stamparlo in modo ben formattato, convertirlo in una pagina man, ecc.

Per quanto riguarda la shell, è sufficiente sostituirla 'END'con '=cut'.

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

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

etc.

=cut
echo "after comment"

(Trovato su " Incorporamento della documentazione nello script di shell ")


0

Un'altra modalità è: se il tuo editor NON HA UN BLOCCO opzione di commento,

  1. Apri una seconda istanza dell'editor (ad esempio File => Nuovo file ...)
  2. Dal file PRECEDENTE su cui stai lavorando, seleziona SOLO LA PARTE CHE VUOI COMMENTARE
  3. Copialo e incollalo nella finestra del nuovo file temporaneo ...
  4. Apri il menu Modifica, seleziona SOSTITUISCI e inserisci come stringa da sostituire '\ n'
  5. input come stringa di sostituzione: '\ n #'
  6. premere il pulsante 'Sostituisci TUTTO'

FATTO

Funziona con QUALSIASI editor


0

Mi piace aprire e chiudere una sola riga:

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

'##' mi aiuta a trovare facilmente l'inizio e la fine del commento sul blocco. Posso inserire un numero dopo il '##' se ne ho un sacco. Per disattivare il commento, ho solo un '1' nel '[]'. Inoltre evito alcuni problemi che ho avuto con virgolette singole nel blocco commentato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.