2010-03-26 19 views
96

Mi piacerebbe essere in grado di commentare un singolo flag in un comando a riga singola. Bash sembra avere solo commenti from # till end-of-line. Sto osservando trucchi del tipo:Commenti in linea per Bash?

ls -l $([ ] && -F is turned off) -a /etc 

È brutto, ma meglio di niente. C'è un modo migliore?

Quanto segue sembra funzionare, ma non sono sicuro se è portatile:

ls -l `# -F is turned off` -a /etc 
+0

Il trucco '# comment' è menzionato anche qui: http://stackoverflow.com/questions/9522631/bash-how-to-put-line-comment-per-a-multi-line-command –

+0

Seguendo il [collegamento] (http://stackoverflow.com/a/12797512/1342186) citato da @Juha Palomäki , c'è questo meraviglioso trucco '$ {IFS # comment}' introdotto da @pjh nei commenti. Non è stata invocata alcuna sotto-shell. – alexis

risposta

14

$(: ...) è un po 'meno brutto, ma ancora non va bene.

+0

Con questa sintassi si attiva una sotto-shell, un commento è posizionato per migliorare la redability senza modificare il comportamento del codice, ma il tempo per rilasciare/terminare questa sub shell renderà il codice più lento (per non dire altro) , perché non utilizzare solo i due punti all'inizio di una nuova riga? – Rafareino

+0

Con $ {IFS # ...} non viene invocata alcuna sotto-shell. – alexis

+0

@Rafareino: si. Ma seriamente, nel 95% delle applicazioni questo overhead non ha alcuna importanza. Per molti dei casi in cui è importante, sarebbe probabilmente stata una buona idea usare un linguaggio più veloce di Bash in primo luogo. – leftaroundabout

0

Se il commento vale la pena, probabilmente può andare alla fine della riga, o su una riga per conto proprio. Raramente ho bisogno di commenti in linea con il codice prima e dopo il commento in qualsiasi lingua.

Oh, c'è un'eccezione, che è il dialetto di SQL che di solito uso che utilizza '{commenti}'. Occasionalmente, scriverò:

CREATE UNIQUE INDEX u1_table ON Table(...); 
CREATE {DUPS} INDEX d1_table ON Table(...); 

Ma anche quello è un allungamento.

45

Trovo più facile (e più leggibile) per copiare solo la linea e commentare la versione originale:

#Old version of ls: 
#ls -l $([ ] && -F is turned off) -a /etc 
ls -l -a /etc 
+0

Voto positivo per maggiore chiarezza. Non so perché questa non è la prima opzione. – Davdriver

1

maggior parte dei comandi permettono args a venire in qualsiasi ordine. Basta muovere le bandiere commentato alla fine della linea:

ls -l -a /etC# -F is turned off 

Poi, per riaccenderlo, basta rimuovere il commento e rimuovere il testo:

ls -l -a /etc -F 
2

Ecco la mia soluzione per commenti in linea tra filodiffusione multipla comandi.

esempio di codice commentata:

#!/bin/sh 
    çat input.txt \ 
    | grep something \ 
    | sort -r 

Soluzione per un commento tubo (utilizzando una funzione di supporto):

#!/bin/sh 
    pipe_comment() { 
     cat - 
    } 
    cat input.txt \ 
    | pipe_comment "filter down to lines that contain the word: something" \ 
    | grep something \ 
    | pipe_comment "reverse sort what is left" \ 
    | sort -r 

Oppure, se preferite, ecco la stessa soluzione, senza la funzione di supporto, ma è un po 'di disordine:

#!/bin/sh 
    cat input.txt \ 
    | cat - `: filter down to lines that contain the word: something` \ 
    | grep something \ 
    | cat - `: reverse sort what is left` \ 
    | sort -r 
+4

Per inciso, se sposti il ​​carattere della pipa alla fine della riga precedente, puoi sbarazzarti delle backlines-yucky yucky. – tripleee

4

Che ne dici di memorizzarlo in una variabile?

#extraargs=-F 
ls -l $extraargs -a /etc 
1

Se si sa che una variabile è vuota, è possibile utilizzarla come commento. Ovviamente, se non è vuoto, rovinerà il tuo comando.

 
ls -l ${1# -F is turned off} -a /etc 

§ 10.2. Parameter Substitution

50

Il mio preferito è:

Commenting in BASH script

Ciò avrà un po 'di testa, ma tecnicamente lo fa rispondere alla tua domanda

echo abc `#put your comment here` \ 
    def `#another chance for a comment` \ 
    xyz etc 

E di condutture in particolare, v'è una soluzione pulita senza overhead

echo abc |  # normal comment OK here 
    tr a-z A-Z | # another normal comment OK here 
    sort |  # the pipelines are automatically continued 
    uniq   # final comment 

How to Put Line Comment for a Multi-line Command

+1

Nota che devi usare i backtick, '$ (# commento)' non funziona. – funroll

+1

Perché '$()' non funziona? – Hendrikto

+1

Alcune versioni considereranno il ')' come parte del commento stesso. La maggior parte delle sfide di bash sono dovute alla retro compatibilità con le versioni precedenti e una strategia comune consiste nell'utilizzare la soluzione più vecchia possibile. – Rafareino

0

Per disabilitare una parte di un comando come a && b, ho semplicemente creato uno script vuoto x che si trova sul percorso, in modo da poter fare le cose come:

mvn install && runProject 

quando ho bisogno di costruire, e

x mvn install && runProject 

quando non (utilizzando Ctrl + A e Ctrl + E per spostarsi all'inizio e alla fine).

Come notato nei commenti, un altro modo per farlo è Bash built-in : invece di x:

$ : Hello world, how are you? && echo "Fine." 
Fine. 
+1

Un tale builtin esiste già: ':' Come in: 'stringa; di; comandi; : Disabilitato; abilitato; ' – xenithorb

+0

Ancora meglio :) Grazie –