Cosa significa trattino "-" alla fine di un comando?


78

Dato il seguente comando:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

Cosa significa " -alla fine del comando"? È una specie di segnaposto?


3
Un piccolo dettaglio da menzionare: il -non deve essere alla fine del comando. Ad esempio: ls -l | diff - /old_ls_output.txt.
arte

Risposte:


82

In questo caso, significa "input standard". Viene utilizzato da alcuni software (ad es. tar) Quando è richiesto un argomento per i file e invece è necessario utilizzare stdin. Non è un costrutto shell e dipende dal programma che stai usando. Controlla la manpage in caso di dubbi!

In questo caso, l'input standard è l'argomento -fdell'opzione. Nei casi in cui -non è supportato, puoi cavartela usando qualcosa di simile tar xvf /proc/self/fd/0o tar xvf /dev/stdin(quest'ultimo è ampiamente supportato in vari unices).

Non fare affidamento su questo per indicare "input standard" universalmente. Poiché non è interpretato dalla shell, ogni programma è libero di gestirlo a proprio piacimento. In alcuni casi, è un output standard o qualcosa di completamente diverso: su di suesso significa "avvia una shell di accesso". In altri casi, non viene affatto interpretato. La memoria muscolare mi ha fatto creare alcuni file chiamati -perché una versione di qualche programma a cui ero abituato non capiva il trattino.


4
Può anche significare STDOUT, a seconda del contesto.
bahamat,

3
E praticamente qualsiasi altra cosa, poiché spetta ai singoli programmi interpretarli.
Alexios,

5
/dev/stdino /dev/stdoutpuò essere utilizzato se si desidera davvero un flusso di input / output. Si noti che si tratta di uno stream, i programmi che desiderano cercare in un file potrebbero non funzionare correttamente con esso, come nel caso di -(ad esempio ffmpeg)
Lekensteyn,

3
Nel caso di bash, il trattino viene interpretato dalla shell. Vedere la Guida avanzata agli script di Bash - Capitolo 3. Caratteri speciali , quindi cercare il testo [trattino] o "reindirizzamento da / a stdin o stdout". Usando bashpuoi usare il trattino nella maggior parte dei luoghi in attesa di un nome file. È un ovvio complemento di <| > IMHO
bsd

4
Non sono convinto che sia così. Innanzitutto, le catmaniglie -(controlla la manpage). Una versione di shell integrata catpotrebbe o meno, ma non è strettamente l'intera shell. Inoltre, se la shell fosse gestita -, potresti dire echo -e si espanderebbe a qualcos'altro. Invece, fa solo eco a un trattino (no /dev/stdino /proc/self/fd/0). E echo test > -crea semplicemente un file chiamato -, quindi chiaramente non lo gestisce nemmeno lì. Oh, e la pagina che hai elencato non dice che è gestita dalla shell , dice che puoi usarla con cate diff, entrambi i quali comprendono i trattini in modo esplicito.
Alexios,

13

In questo caso, in -realtà è abbastanza inutile, supponendo che tu stia eseguendo Linux:

Tar GNU (la versione su Linux) accetta il suo input dallo standard input di default. Se non si desidera questo comportamento e si desidera passare il nome del file come argomento della riga di comando, è necessario specificare il flag f:

tar xf filename

Quindi questo è lo stesso di

tar x < filename

Oppure, se l'input è compresso come nel tuo esempio:

gzip -dc filename | tar x

Non è significativo specificare fqui il flag, ma poiché è stato specificato, il nome del file deve essere indicato in modo -da indicare che vogliamo leggere dallo standard input (vedi altra risposta). Quindi, per ripetere, questo è ridondante e leggermente strano.

Inoltre, la riga sopra può essere semplificata perché si può dire a GNU tar di trasmettere l'input attraverso gzipse stesso specificando il zflag:

tar xfz filename

- Non è necessario chiamare gzipesplicitamente.


1
Nota: non tutti tarhanno zun'opzione.
liori,

2
La maggior parte dei sistemi operativi diversi da Linux ha come tarimpostazione predefinita la prima unità nastro, per motivi storici.
Gilles,

1
@Gilles e BSD e OS X,…. Ma sono curioso: quali altri sistemi, tranne in alcuni vecchi mainframe, usano ancora una tale versione (quali sistemi diversi dai mainframe hanno persino un'unità a nastro)?
Konrad Rudolph,

1
@KonradRudolph Tutti e tre i principali BSD impostano automaticamente un'unità a nastro ( /dev/sa0su FreeBSD 9.0, /dev/rst0su NetBSD 6.0 e OpenBSD 5.1). Per impostazione predefinita, AIX 7.1 è /dev/rmt0. L'impostazione predefinita di MINIX3 è /dev/sa0. (Ho controllato la versione del sistema operativo più recente in ogni caso, questi non sono "vecchi mainframe".) Solaris è configurabile tramite un file /etc, che ritengo predefinito su un'unità nastro. Tar GNU, Schilling tar, OSX e BusyBox sono impostati su stdin / stdout.
Gilles,

1
@Gilles - Ho ricompilato tarper impostazione predefinita la seconda unità nastro, per ovvi motivi. :)
David Harkness,
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.