Commenti su script di shell multilinea: come funziona?

Recentemente mi sono imbattuto in un tipo di commento su più righe che non avevo mai visto prima: ecco un esempio di script:

echo a # : aaa : ddd # echo b 

Questo sembra funzionare, anche vim lo evidenzia con la sintassi. Come viene chiamato questo stile di commento e come posso trovare maggiori informazioni su di esso?

Commenti

  • E se invece avvolgessi il tuo codice in una funzione per commentarlo? CommentedOutBlock() { echo "test"; }
  • Come altri hanno già detto, i commenti su più righe non sono disponibili in modo nativo. Quindi uso se falso; quindi < quante righe vuoi > fi

Risposta

Questo non è un commento su più righe. # è un commento a riga singola. : (due punti) non è affatto un commento, ma piuttosto un comando incorporato della shell che è fondamentalmente un NOP , unoperazione nulla che non fa altro che restituire true, come true (e quindi impostare $? a 0 come effetto collaterale). Tuttavia, poiché è un comando, può accettare argomenti e poiché ignora i suoi argomenti, nella maggior parte dei casi agisce superficialmente come un commento. Il problema principale con questo kludge è che gli argomenti sono ancora espansi, portando a una serie di conseguenze indesiderate. Gli argomenti sono ancora interessati da errori di sintassi, i reindirizzamenti vengono comunque eseguiti, quindi : > file troncerà file e : $(dangerous command) le sostituzioni verranno comunque eseguite.

Il modo meno sorprendente e completamente sicuro per inserire commenti negli script di shell è con #. Attenersi a questo anche per i commenti su più righe. Non tentare mai di (ab) utilizzare : per i commenti. Non esiste un meccanismo di commento multilinea dedicato nella shell che sia analogo al modulo /* */ a forma di stella in linguaggi simili a C.


Per completezza, ma non perché sia pratica consigliata, menzionerò che è possibile utilizzare here-documents per fare “commenti” su più righe:

: <<"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 

Commenti

  • +1 molto importante per mantieni le virgolette singole sulla riga <<, che disattiva la sostituzione e lespansione.
  • E come nota aggiuntiva, riempi gli script della shell con : per cose che dovrebbero essere commenti causerà un consumo extra di RAM / CPU. ‘ non è interessato a cose semplici sul desktop, ma se ‘ è qualcosa eseguito centinaia o migliaia di volte al secondo, ‘ ll non fare nulla, velocissimo .
  • @bahamat: se esegui qualcosa a centinaia o migliaia di volte al secondo, spero che tu non ‘ lo scriva nella shell … = /
  • A volte, usando lutilità null per più righe di il testo può essere utile. Lavvio del commento con : <<=cut rende possibile scrivere POD negli script della shell, vedere questo esempio per i dettagli . Ciò rende possibile utilizzare perldoc script.sh. Tuttavia, il commento su più righe mostrato in questa risposta è qualcosa che dovrebbe essere sicuramente un blocco di commenti (ogni riga che inizia con # ).
  • Qui ‘ una bella discussione su heredocs, usata sia per i commenti che per altri casi duso interessanti (inclusa la generazione di script dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Risposta

Non è qualsiasi stile di commento. Il comando integrato : non fa assolutamente nulla; viene abusato per i commenti qui.

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

Risposta

Nelle prime shell, i due punti erano lunico modo per creare commenti.

Tuttavia, non lo è un vero commento, perché la riga viene analizzata esattamente nello stesso modo in cui viene analizzato qualsiasi altro comando e ciò potrebbe avere effetti collaterali. Ad esempio:

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

(a volte i due punti vengono utilizzati esclusivamente allo scopo di richiamare quegli effetti collaterali, ma poi non vengono utilizzati come commento.)

A volte è conveniente usare i due punti per commentare una sezione di uno script:

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

Questo è un ottimo risparmio di tempo rispetto ai precedenti riga con #, in particolare se il commento è solo temporaneo.

Commenti

  • Quel singolo- Il metodo di commento delle virgolette ‘ non funziona su nessuna sezione dello script che a sua volta utilizza virgolette singole.E se stai usando virgolette quasi quanto dovresti, significa che ‘ avrai virgolette singole legittime sparse in tutto lo script. È molto più semplice usare un qualsiasi editor decente che ti consenta di bloccare i commenti a riga.
  • Hai ragione che funzionerà solo se non ci sono virgolette singole nella sezione citata. Tuttavia, uno script non ha bisogno di molte virgolette singole. Esaminando alcuni dei miei script, li trovo relativamente scarsi e molti potrebbero essere sostituiti da virgolette doppie.
  • La scelta di virgolette singole o doppie dovrebbe difficilmente essere influenzata da qualcosa di così banale e irrilevante a preoccuparti se il testo del tuo script sia esso stesso una stringa valida con virgolette singole. Le virgolette singole vengono utilizzate per evitare espansioni, mentre le virgolette doppie consentono determinate espansioni e richiedono unanalisi aggiuntiva. Questo è il vero criterio per determinare quale usare.
  • Questo è di gran lunga il modo più chic per farlo. Ottimo per piccoli blocchi di documentazione. Mi piace di più di /* */ e ugh, non ‘ per iniziare con <!-- --> !

Risposta

Se il tuo commento si trova alla fine dello script, puoi farlo in questo modo:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *