Qual è la magia di "-" (un trattino) nei parametri della riga di comando?


101

Esempi:

  • Crea un'immagine ISO e masterizzala direttamente su un CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Passa alla directory precedente.

    cd -

  • Ascolta sulla porta 12345 e untar i dati inviati ad essa.

    nc -l -p 12345 | tar xvzf -

Qual è lo scopo del trattino e come si usa?

Risposte:


111

Se intendi il nudo -alla fine del tarcomando, è comune a molti comandi che vogliono usare un file.

Consente di specificare input o output standard anziché un nome file effettivo .

Questo è il caso del tuo primo e terzo esempio. Ad esempio, il cdrecordcomando prende l'input standard (il flusso di immagini ISO prodotto da mkisofs) e lo scrive direttamente in /dev/dvdrw.

Con il cdcomando, ogni volta che cambi directory, memorizza la directory da cui provieni. Se lo fai cdcon lo speciale -"nome directory", usa quella directory ricordata invece di una vera. Puoi facilmente passare da una directory all'altra abbastanza rapidamente usando quello.

Altri comandi possono essere trattati -come un valore speciale diverso .


9
nota che puoi anche usare -per i rami git, cioè puoi tornare al tuo ramo precedente congit checkout -
snappieT

3
Dove nei documenti di tar spiega che è supportato? Come faccio a sapere quali comandi lo supportano?

1
Se un comando ha un significato speciale per -, puoi trovare la sua spiegazione nella pagina man.
codeforester

su - #make the shell a login shell
atongsa

Trovo un comando come questo molto curioso: tar -cvf - / home | aescrypt -e -p mele -> backup_files.tar.aes che è in realtà tar -cvf - / home | aescrypt -e -p mele -o backup_files.tar.aes - perché il carattere piping | dovrebbe rendere superflua la presenza dell'ultimo trattino. Ma senza l'ultimo trattino il comando fallisce. Sembra illogico. Qualcuno può darmi un riferimento in cui viene spiegato il significato del trattino nudo nelle righe di comando. Non riesco a trovarne.
elmclose il

22

Non è magia. Alcuni comandi interpretano -come l'utente che desidera leggere da stdin o scrivere su stdout; non c'è niente di speciale nella shell.


9
Tranne nel caso di cd -; bash(1)gestisce cd -come se avessi scritto cd $OLDPWD.
sarnold

6
@sarnold Ma il punto è lo stesso, cd- un comando incorporato della shell - interpreta un trattino stesso. Nessuna "magia" :-)

2
@pst, certo, nessuna magia (è tutto solo il codice :), ma non v'è qualcosa di speciale per la shell.
sarnold


10

-significa esattamente ciò che ogni comando vuole che significhi. Esistono diverse convenzioni comuni e hai visto esempi della maggior parte di esse in altre risposte, ma nessuna di esse è universale al 100%.

Non c'è niente di magico nel -personaggio per quanto riguarda la shell (tranne che la shell stessa e alcuni dei suoi comandi incorporati come cde echo, lo usano in modi convenzionali). Alcuni personaggi, come \, 'e ", sono "magici" e hanno significati speciali ovunque appaiano. Questi sono "metacaratteri della shell". -non è così.

Per vedere come viene utilizzato un determinato comando -, leggi la documentazione di quel comando .


7

La magia è nella convenzione. Per millenni, le persone hanno usato "-" per distinguere le opzioni dagli argomenti e hanno usato "-" in un nome di file per indicare stdin o stdout, a seconda dei casi. Non sottovalutare il potere delle convenzioni!


Non sopravvalutare la capacità delle persone di discernere il modo di parlare dalle espressioni letterali. Questo non accade da millenni.
tripleee

1
@tripleee - Vero, ma va avanti da miliardi di secondi. ;-)
David R Tribble il

5

Significa usare il flusso di input standard del programma.

Nel caso di cd, significa qualcosa di diverso: passare alla directory di lavoro precedente.

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.