Commenti in linea per Bash?


142

Mi piacerebbe essere in grado di commentare un singolo flag in un comando di una riga. Bash sembra avere solo from # till end-of-linecommenti. Sto guardando trucchi come:

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 che sia portatile:

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

Il #commenttrucco è anche menzionato qui: stackoverflow.com/questions/9522631/…
Juha Palomäki,

1
Seguendo il link citato da @Juha Palomäki, c'è questo meraviglioso trucco ${IFS#comment}introdotto da @pjh nei commenti. Non viene invocata alcuna shell secondaria.
alexis

Risposte:


110

Il mio preferito è:

Commentando in uno script Bash

Questo avrà un certo sovraccarico, ma tecnicamente risponde alla tua domanda

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

E per le tubazioni in particolare, esiste una soluzione più pulita senza spese generali

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

Come inserire un commento di riga per un comando multilinea


3
Nota che devi usare i backtick, $(#comment)non funziona.
funroll,

1
Alcune versioni considereranno la )parte del commento stesso. La maggior parte delle sfide di bash sono dovute alla retro compatibilità con le versioni precedenti e una strategia comune è quella di utilizzare la soluzione più vecchia possibile.
Rafareino,

2
Nota, questo non è un vero commento: true && `# comment` && trueè un'espressione valida. Un vero commento genererebbe qualcosa del tipo: syntax error near unexpected token && ''
Sebastian Wagner,

Hai ragione @sebastianwagner, nota anche che fallirebbe in un corto circuito OR o qualcosa del genere, ma penso che sia il massimo che possiamo ottenere senza complicare molto le cose. Per me è un segno che uno ha bisogno di un linguaggio migliore, ma può fare benissimo, mantenendo il codice già costruito con tali "commenti" per documentarlo.
Rafareino,

Grazie che mi ha aiutato!
xiarnousx,

58

Trovo più semplice (e più leggibile) semplicemente copiare la riga e commentare la versione originale:

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

Voto per chiarezza. Non so perché questa non è la prima opzione.
David Tabernero M.

ma allora non è in linea? suppongo che sia giusto dire che la necessità di fare cose che non sono supportate da bash è trovare un altro modo
ThorSummoner,

25

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


2
Con questa sintassi si sta eseguendo una sub-shell, viene aggiunto un commento per migliorare la redability senza modificare affatto il comportamento del codice, ma il tempo di lanciare / terminare questa sub-shell renderà il codice più lento (per non dire altro), perché non usare solo i due punti all'inizio di una nuova linea?
Rafareino,

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

3
@Rafareino: sì. Ma seriamente, nel 95% delle applicazioni questo sovraccarico non avrà alcuna importanza. Per molti dei casi in cui è importante, probabilmente sarebbe stata una buona idea usare un linguaggio più veloce di Bash in primo luogo.
lasciato il

... il problema è che la $(: ...)sintassi non sembra effettivamente consentire l'incorporamento dei commenti: mentre echo "foo" `# comment` "bar"terminerà il commento al secondo backtick, l'equivalente supposto echo "foo" $(: # comment) "bar"non analizza nulla dietro il #.
lasciato il

4

Che ne dici di memorizzarlo in una variabile?

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

4

Ecco la mia soluzione per i commenti incorporati tra più comandi inoltrati.

Esempio di codice non commentato:

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

Soluzione per un commento sulla pipe (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

O se preferisci, ecco la stessa soluzione senza la funzione helper, ma è un po 'più complicata:

    #!/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

7
Per inciso, se sposti il ​​personaggio della pipa alla fine della riga precedente, puoi sbarazzarti delle schifose barre rovesciate.
Tripleee

3

La maggior parte dei comandi consente agli arg di arrivare in qualsiasi ordine. Basta spostare i flag commentati alla fine della riga:

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

Quindi per riattivarlo, basta decommentare e rimuovere il testo:

ls -l -a /etc -F

1
accidenti, ho aggiunto #senza un singolo spazio bianco dopo il comando. grazie!
as


1

Per disabilitare una parte di un comando come a && b, ho semplicemente creato uno script vuoto xche è sul percorso, quindi posso fare cose come:

mvn install && runProject

quando ho bisogno di costruire, e

x mvn install && runProject

quando no (usando Ctrl + Ae Ctrl + Eper spostarsi all'inizio e alla fine).

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

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

2
Tale incorporazione esiste già: :Come in:string; of; commands; : disabled; enabled;
xenithorb il

Ancora meglio :) Grazie
Ondra Žižka

-1

Se vale la pena commentare, probabilmente può andare alla fine della riga o su una riga a sé stante. Raramente ho bisogno di commenti all'interno della riga con il codice prima e dopo il commento in qualsiasi lingua.

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

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

Ma anche quello è un tratto.

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.