Che cosa significa il trattino "-" in "tar xzf -"?


23

Quando provo ad installare dropbox dalla riga di comando, leggo i comandi

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

che cosa -significa qui? è la directory precedente?


9
Un po 'di pedanteria: l'opzione che stai chiedendo è f -. Questo potrebbe rendere un po 'più facile trovare la risposta nelle pagine man.
Studog

4
Sarebbe davvero utile se tu potessi spiegare cosa, precisamente non ti è chiaro sulla documentazione di wgete tar. In questo modo, i rispettivi sviluppatori possono migliorare la loro documentazione in modo che i futuri utenti non si imbattano nuovamente negli stessi problemi. In altre parole: essere un eroe e rendere il mondo un posto migliore!
Jörg W Mittag,

2
Sarebbe un buon default per tar usare stdin, ma dal momento che l'eredità è di lavorare con i nastri non lo ha fatto. Invece ha imparato a lavorare con i file (con l'opzione f) e quindi segue la convenzione per avere un - al posto del nome file per stdin (Nel caso di eXtract o stdout in caso di Crea)
eckes

1
@eckes Nel caso di GNU tar, stdin è l'impostazione predefinita a meno che non $TAPEsia impostata.
Chrylis

Risposte:


42

Alcuni comandi accettano -al posto di un nome file, sia:

  • Scrivere nell'output standard anziché in un file denominato. Questo è ciò che l' -argomento è passato wgetdopo -O.
  • Leggere dall'input standard anziché da un file denominato. Questo è ciò a cui l' -argomento è passato tardopo xzf.

Il comando che hai mostrato scarica un file di archivio wgete lo decomprime tar. Per ottenere ciò, l'output di wgetviene convogliato ( |) all'ingresso di tar. Questo è il motivo wgetper cui scrive nello standard output anziché in un file e tarlegge dallo standard input anziché da un file.


Direi "la maggior parte dei comandi" anziché solo "alcuni comandi". Credo che faccia parte della specifica della sintassi dell'opzione POSIX.
Barmar,

2
@Barmar Sì e no: Linea guida 13: per le utility che utilizzano 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 -. . Quindi se - è un operando per una "opzione file" e ha un significato speciale, allora deve essere quello di stdin / stdout. Il programma è gratuito per non trattare un caso speciale e cercare semplicemente un file-
Bakuriu,

(e in genere in quei casi omettere l'opzione sarà lo stesso che usare -)
Bakuriu

@Bakuriu Non vedo come ciò confuta ciò che ho detto. Sospetto che la maggior parte dei comandi prendano argomenti sui nomi dei file, quindi dovrebbero seguire quella linea guida. Ma forse avrei dovuto qualificarlo come "la maggior parte dei comandi che operano su file".
Barmar,

1
@Barmar Un modo per seguire le linee guida è rifiutare di trattare in modo -speciale, trattandolo come un nome di file letterale. L'unico modo per andare contro la linea guida è quello di trattare in modo -speciale ma con un significato diverso da quelli suggeriti dalla linea guida.
Eliah Kagan,

12

Questo è solo un nome di file che molti programmi Unix interpretano come "invece di aprire effettivamente un file, leggere stdin(o scrivere stdout)".

Ciò significa leggere dall'input che viene trasmesso in streaming nel programma; nel tuo caso, questo è l'output di wget.


6
È davvero un nome di file , però?
Eric Duminil,

7
@EricDuminil È un nome di file, nel senso che i programmi lo accettano in alcuni punti in cui altrimenti accetterebbero solo i nomi di file, ma hai ragione nel dire che non si tratta in realtà di un vero nome di un file in una directory.
JoL

5
@EricDuminil: in particolare, per i programmi che seguono questa convenzione, è necessario utilizzare ./-se si desidera effettivamente aprire un file denominato -.
Jörg W Mittag,

4
@EricDuminil In effetti: sì! Esso nomi di un file di ; nel senso unix, stdinè un descrittore di file ed -è il nome che fornisci per usarlo. Tuttavia, non è un nome di file dal punto di vista del sistema operativo. Solo dal punto di vista dell'utente.
Marcus Müller,

3
@rexkogitans no. /dev/stdinè solo un nome di file di convenienza offerto da alcune funzionalità del kernel. Di solito non fopen("/dev/stdin", "r") succede nulla quando scrivi un programma che sceglie di usare stdin; basta andare avanti e usare il extern FILE* stdincomando fornito dall'intestazione libc; a proposito, questo è il descrittore di file intero 0.
Marcus Müller il

5

L' -argomento per tarspecificare che l'archivio deve essere letto stdininvece di un file. Dal manuale di tar GNU :

Se si utilizza -come nome-archivio , tarlegge l'archivio dall'input standard (quando si elencano o si estraggono file)

Altri comandi hanno lo stesso comportamento ed è specificato dallo standard POSIX.1-2017 :

Orientamento 13 :

Per le utility che utilizzano 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 chiamato -.

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.