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.