Cosa significa l'ultimo “-” (trattino) nelle opzioni di `bash`?


15

In questa esercitazione è necessario eseguire il comando seguente:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Cosa significa l'ultimo -(trattino) dopo bash?

Ho visto molti comandi con questo, e non sono riuscito a trovare una spiegazione logica e non trovo nemmeno come riformulare una ricerca su Google per questo. È l'output del comando piped?


5
Stessa domanda su Ask Ubuntu - con lo stesso esempio!
200_successo

2
Scaricare roba dalla rete e trasferirla direttamente in sudo bashsuoni davvero spaventosi. Prova a cercare un tutorial che non incoraggi tali pratiche.
Hmakholm ha lasciato Monica il

È il tutorial npm, ma sono d'accordo con te ...
Omar BISTAMI il

1
Se devi cercare cose con simboli all'interno, prova symbolhound.com.
Joe

Risposte:


31

Bash si comporta in un modo un po 'fuori dal comune quando si tratta di -.

POSIX dice:

Linea guida 10:
Il primo --argomento che non è un argomento-opzione dovrebbe essere accettato come delimitatore che indica la fine delle opzioni. Eventuali argomenti seguenti devono essere trattati come operandi, anche se iniziano con il -carattere.

[...]

Linea guida 13:
per le utility che utilizzano gli operandi per rappresentare i file da aprire per la lettura o la scrittura, l' -operando dovrebbe essere usato per indicare solo input standard (o output standard quando è chiaro dal contesto che viene specificato un file di output) o un file denominato -.

E

Laddove un'utilità descritta nel volume Shell and Utilities di POSIX.1-2017 come conforme a queste linee guida sia richiesta per accettare o non accettare l'operando -come input o output standard, questo utilizzo è spiegato nella sezione OPERANDS. Altrimenti, se tale utility utilizza operandi per rappresentare i file, viene definito dall'implementazione se l'operando -sta per input standard (o output standard) o per un file denominato- .

Ma poi man 1 bashlegge:

A --segnala la fine delle opzioni e disabilita l'ulteriore elaborazione delle opzioni. Eventuali argomenti dopo il --sono trattati come nomi di file e argomenti. Un argomento di -equivale a --.

Quindi per Bash -non significa né input standard né un file, quindi un po 'non standard.

Ora il tuo caso particolare:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Ho il sospetto che l'autore di questo comando potrebbe non rendersi conto -che --in questo caso è equivalente . Ho il sospetto che l'autore volesse assicurarsi bashche leggesse dal suo input standard, si aspettavano -che funzionasse secondo la linea guida 13.

Ma anche se funzionasse secondo le linee guida, -qui non sarebbe necessario perché bashrileva quando il suo input standard è una pipe e agisce di conseguenza (a meno che non -cvenga fornito ecc.).

Eppure -non funziona secondo le linee guida, funziona come --. --Qui non è ancora necessario perché non ci sono argomenti dopo.

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 di seguito.


catnel mio Kubuntu obbedisce a entrambe le linee guida e lo userò per dimostrare l'utilità di -e-- .

Lascia che fooesista un file chiamato . Questo stamperà il file:

cat foo

Lascia che --helpesista un file chiamato . Questo non stampa il file:

cat --help

Ma questo stamperà il file chiamato --help:

cat -- --help

Ciò concatenerà il file denominato --helpcon qualsiasi cosa provenga dall'input standard:

cat -- --help -

Sembra che non ti serva davvero --, perché puoi sempre passare ./--helpquale sarà sicuramente interpretato come un file. 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"

6

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 usarlo -dopo bashin questo caso, ma non fa male.


Grazie per la risposta, Sì, ho citato il comando completo. quindi qualsiasi cosa dopo - o - non sarà vista come un'opzione ma come un nome di file o argomenti, potresti per favore fare un esempio in cui è utile?
Omar BISTAMI,

1
È davvero per consentire uno script il cui nome inizia -, un requisito improbabile, ma -/ lo --rende possibile.
AFH,

1
@OmarBISTAMI La quotazione di un comando influenzerà il modo in cui la shell lo espande, ma non influenzerà nessuno degli argomenti che lo seguono. Se estendi le virgolette attorno ad argomenti legittimi, diventano parte del nome del comando che non è nemmeno quello che desideri. Esistono alcuni comandi che accettano i nomi dei file come argomenti, ma non utilizzano l'input standard per impostazione predefinita. Un esempio inventato consente di inserire un input (da un terminale o una pipe) tra due file. cat file1 - file2 > file3.
Joe

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash -significa che bashsta aspettando lo stdin. Quindi praticamente bash eseguirà tutto ciò che viene restituito dal comando che si trova a sinistra di|

Un esempio simile ma più semplice sarebbe:

echo hello | cat - qui, catstampa "ciao". Perché? Perché "ciao" viene inviato al gatto |e catsta aspettando qualsiasi cosa gli venga inviata

Ora suddividiamo l'intero comando in due:

curl -sL https://rpm.nodesource.com/setup_6.x

questo comando arricciatura restituirà qualcosa che può essere compreso ed eseguito da bash

quindi abbiamo una pipe |che invierà l'output restituito dal comando curl al lato destro della pipe cioè sudo -E bash -. Infine sudo -E bash -, bash è pronto per eseguire tutto ciò che gli viene inviato

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.