Risposte:
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 -f
dell'opzione. Nei casi in cui -
non è supportato, puoi cavartela usando qualcosa di simile tar xvf /proc/self/fd/0
o 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 su
esso 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.
STDOUT
, a seconda del contesto.
/dev/stdin
o /dev/stdout
può 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)
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 bash
puoi usare il trattino nella maggior parte dei luoghi in attesa di un nome file. È un ovvio complemento di <| > IMHO
cat
maniglie -
(controlla la manpage). Una versione di shell integrata cat
potrebbe 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/stdin
o /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 cat
e diff
, entrambi i quali comprendono i trattini in modo esplicito.
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 f
qui 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 gzip
se stesso specificando il z
flag:
tar xfz filename
- Non è necessario chiamare gzip
esplicitamente.
tar
hanno z
un'opzione.
tar
impostazione predefinita la prima unità nastro, per motivi storici.
/dev/sa0
su FreeBSD 9.0, /dev/rst0
su 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.
tar
per impostazione predefinita la seconda unità nastro, per ovvi motivi. :)
-
non deve essere alla fine del comando. Ad esempio:ls -l | diff - /old_ls_output.txt
.