Bash si comporta in modo alquanto non standard quando si tratta di -
.
POSIX dice:
Orientamento 10:
Il primo--
argomento che non è un argomento di opzione dovrebbe essere accettato come delimitatore che indica la fine delle opzioni. Tutti gli argomenti successivi devono essere trattati come operandi, anche se iniziano con-
carattere.[…]
Orientamento 13:
Per le utilità che usano gli operandi per rappresentare i file da aprire per la lettura o la scrittura, il-
operando dovrebbe essere usato per indicare solo input standard (o output standard quando è chiaro dal contesto che è stato specificato un file di output) o un file chiamato-
.
E
Quando un'utilità descritta nel volume Shell and Utilities di POSIX.1-2017 come conforme a queste linee guida è tenuta ad accettare o non accettare l'operando
-
per indicare input o output standard, questo utilizzo è spiegato nella sezione OPERANDI. Altrimenti, se tale utilità utilizza gli operandi per rappresentare i file, è definito dall'implementazione se l'operando-
sta per standard input (o standard output), o per un file chiamato-
.
Ma poi man 1 bash
recita:
Un
--
segnala la fine delle opzioni e disabilita l'ulteriore elaborazione delle opzioni. Qualsiasi argomento dopo--
vengono trattati come nomi di file e argomenti. Un argomento di-
equivale a--
.
Quindi per Bash -
non significa né input standard né file, quindi in qualche modo non standard.
Ora il tuo caso particolare:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
sospetto l'autore di questo comando potrebbe non realizzare -
equivale a --
in questo caso. sospetto l'autore voleva assicurarsi che bash
leggerà dal suo input standard, si aspettavano -
lavorare secondo la linea guida 13.
Ma anche se funzionasse secondo le linee guida, -
non sarebbe necessario qui perché bash
rileva quando il suo input standard è una pipe e agisce di conseguenza (a meno che -c
è dato ecc.).
Ancora -
non funziona secondo le linee guida, funziona come --
. Ancora --
non è necessario qui perché non ci sono argomenti dopo di esso.
Secondo me l'ultimo -
non cambia nulla. Il comando funzionerebbe senza di esso.
Per vedere come --
e -
può essere utile in generale, studia l'esempio qui sotto.
cat
nel mio Kubuntu obbedisce a entrambe le linee guida e lo userò per dimostrare l'utilità di -
e --
.
Lascia un file chiamato foo
esistere. Questo stamperà il file:
cat foo
Lascia un file chiamato --help
esistere. Questo non stamperà il file:
cat --help
Ma questo stamperà il file chiamato --help
:
cat -- --help
Questo concatenerà il file chiamato --help
con tutto ciò che proviene dallo standard input:
cat -- --help -
Sembra che tu non abbia davvero bisogno di --
, perché puoi sempre superare ./--help
che sarà interpretato come un file di sicuro. Ma considera
cat "$file"
quando non sai in anticipo quale sia il contenuto della variabile. Non puoi semplicemente anteporre ./
ad esso, perché potrebbe essere un percorso assoluto e ./
lo spezzerebbe. D'altra parte potrebbe essere un file chiamato --help
(perché perché no?). In questo caso --
è molto utile; questo è un comando molto più robusto:
cat -- "$file"
In man bash
, alla fine delle opzioni a carattere singolo c'è:-
-- A -- signals the end of options and disables further option processing.
Any arguments after the -- are treated as filenames and arguments. An
argument of - is equivalent to --.
Se hai citato il comando completo, non vedo alcun motivo per utilizzare -
dopo bash
in questo caso, ma non nuoce.