Que signifie le tiret «-» dans «tar xzf -»?


23

Lorsque j'essaie d'installer dropbox à partir de la ligne de commande, je lis les commandes

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

que veut -dire ici? est-ce le répertoire précédent?


9
Un peu de pédanterie: l'option que vous demandez est f -. Cela pourrait faciliter la recherche de la réponse dans les pages de manuel.
studog

4
Il serait vraiment utile que vous puissiez expliquer ce qui, précisément , ne vous est pas clair sur la documentation de wgetet tar. De cette façon, les développeurs respectifs peuvent améliorer leur documentation afin que les futurs utilisateurs ne trébuchent plus sur les mêmes problèmes. En d'autres termes: soyez un héros et rendez le monde meilleur!
Jörg W Mittag

2
Ce serait une belle valeur par défaut pour que tar utilise stdin, mais comme son héritage est de travailler avec des bandes, il ne l'a pas fait. Au lieu de cela, il a appris à travailler avec des fichiers (avec l'option f), puis suit la convention pour avoir un - à la place du nom de fichier pour stdin (dans le cas d'eXtract ou stdout dans le cas de Create)
vérifie le

1
@eckes Dans le cas de GNU tar, stdin est la valeur par défaut, sauf si elle $TAPEest définie.
chrylis -on strike-

Réponses:


42

Certaines commandes acceptent -à la place d'un nom de fichier, soit:

  • Pour écrire sur la sortie standard au lieu d'un fichier nommé. C'est ce que fait l' -argument passé wgetaprès -O.
  • Pour lire à partir d' une entrée standard au lieu d'un fichier nommé. C'est à cela que l' -argument est passé taraprès xzf.

La commande que vous avez montrée télécharge wgetet décompresse un fichier archive tar. Pour ce faire, la sortie de wgetest canalisée ( |) vers l'entrée de tar. C'est pourquoi wgetécrit sur la sortie standard au lieu d'un fichier et tarlit à partir de l'entrée standard au lieu d'un fichier.


Je dirais «la plupart des commandes» plutôt que «quelques commandes». Je pense que cela fait partie de la spécification de la syntaxe de l'option POSIX.
Barmar

2
@Barmar Oui et non: Directive 13: Pour les utilitaires qui utilisent des opérandes pour représenter les fichiers à ouvrir pour la lecture ou l'écriture, l'opérande '-' doit être utilisé pour signifier uniquement une entrée standard (ou une sortie standard quand il est clair du contexte que un fichier de sortie est spécifié) ou un fichier nommé -. . Donc, si - c'est un opérande pour une "option de fichier" et qu'il a une signification spéciale, alors ce doit être celui de stdin / stdout. Le programme est libre de ne pas traiter comme un cas spécial et de simplement rechercher un fichier-
Bakuriu

(et généralement dans ces cas, omettre l'option sera la même chose que d'utiliser -)
Bakuriu

@Bakuriu Je ne vois pas comment cela réfute ce que j'ai dit. Je soupçonne que la plupart des commandes prennent des arguments de nom de fichier, elles sont donc censées suivre cette directive. Mais j'aurais peut-être dû le qualifier de "la plupart des commandes qui fonctionnent sur des fichiers".
Barmar

1
@Barmar Une façon de suivre la directive est de refuser de traiter -spécialement du tout, en le traitant comme un nom de fichier littéral. La seule façon d'aller à l'encontre de la directive est de traiter -spécialement mais avec une autre signification que celles suggérées par la directive.
Eliah Kagan

12

C'est juste un nom de fichier que beaucoup de programmes Unix interprètent comme «au lieu d'ouvrir réellement un fichier, lu stdin(ou écrit stdout)».

Cela signifie la lecture de l'entrée qui est diffusée dans le programme; dans votre cas, c'est la sortie de wget.


6
Est-ce vraiment un nom de fichier ?
Eric Duminil

7
@EricDuminil C'est un nom de fichier dans le sens où les programmes l'acceptent à certains endroits où ils n'accepteraient autrement que les noms de fichiers, mais vous avez raison de dire qu'il ne s'agit pas vraiment du nom réel d'un fichier dans un répertoire.
JoL

5
@EricDuminil: En particulier, pour les programmes qui suivent cette convention, vous devez utiliser ./-si vous voulez réellement ouvrir un fichier nommé -.
Jörg W Mittag

4
@EricDuminil En fait: oui! Il nomme un fichier ; au sens unix, stdinest un descripteur de fichier, et -c'est le nom que vous fournissez pour l'utiliser. Ce n'est pas un nom de fichier du point de vue du système d'exploitation, cependant. Seulement du point de vue de l'utilisateur.
Marcus Müller

3
@rexkogitans no. /dev/stdinest juste un nom de fichier pratique offert par une installation du noyau. Il n'y a généralement rien fopen("/dev/stdin", "r") qui se passe lorsque vous écrivez un programme qui choisit d'utiliser stdin; vous allez de l'avant et utilisez le extern FILE* stdinque votre en-tête libc vous a fourni; par ailleurs, c'est le descripteur de fichier entier 0.
Marcus Müller

5

L' -argument à tarspécifie que l'archive doit être lue à la stdinplace d'un fichier. Dans le manuel GNU tar :

Si vous utilisez -comme nom d' archive , tarlit l'archive à partir de l'entrée standard (lors de la liste ou de l'extraction des fichiers)

D'autres commandes ont le même comportement, et il est spécifié par la norme POSIX.1-2017 :

Ligne directrice 13 :

Pour les utilitaires qui utilisent des opérandes pour représenter les fichiers à ouvrir en lecture ou en écriture, l' -opérande ' ' doit être utilisé pour signifier uniquement une entrée standard (ou une sortie standard lorsqu'il est clair d'après le contexte qu'un fichier de sortie est spécifié) ou un fichier nommé -.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.