Que signifie "-" à la fin d'une commande?

79

Étant donné la commande suivante:

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

Que signifie le terme " -à la fin de la commande"? Est-ce une sorte d'espace réservé?

Eugene S
la source
3
Un petit détail à mentionner: le -pas besoin d'être à la fin de la commande. Par exemple: ls -l | diff - /old_ls_output.txt.
Manatwork

Réponses:

83

Dans ce cas, cela signifie «entrée standard». Il est utilisé par certains logiciels (par exemple tar) lorsqu'un argument de fichier est requis et que vous devez utiliser stdin à la place. Ce n'est pas une construction shell et cela dépend du programme que vous utilisez. Consultez la page de manuel en cas de doute!

Dans ce cas, l'entrée standard est l'argument de l' -foption. Dans les cas où il -n'est pas pris en charge, vous pouvez vous en tirer en utilisant quelque chose comme tar xvf /proc/self/fd/0ou tar xvf /dev/stdin(ce dernier est largement pris en charge dans diverses unités).

Ne comptez pas sur cela pour dire «entrée standard» universellement. Comme il n’est pas interprété par le shell, chaque programme est libre de le gérer à sa guise. Dans certains cas, il s’agit d’une sortie standard ou de quelque chose de complètement différent: sucela signifie «lancez un shell de connexion». Dans d'autres cas, ce n'est pas du tout interprété. La mémoire musculaire m'a fait créer pas mal de fichiers nommés, -car une version d'un programme auquel j'étais habitué ne comprenait pas le tiret.

Alexios
la source
4
Cela peut aussi signifier STDOUT, selon le contexte.
bahamat
3
Et à peu près tout le reste, car il appartient aux programmes individuels d’interpréter.
Alexios
5
/dev/stdinou /dev/stdoutpeut être utilisé si vous voulez vraiment un flux d’entrée / sortie. Notez que c’est un flux, les programmes qui veulent chercher dans un fichier peuvent ne pas fonctionner correctement, comme ce serait le cas avec -(par exemple, ffmpeg)
Lekensteyn
3
Dans le cas de bash, le trait d'union est interprété par le shell. Reportez-vous au document Advanced Bash-Scripting Guide - Chapitre 3. Caractères spéciaux , puis recherchez le texte [tiret] ou "redirection de / vers stdin ou stdout". En utilisant, bashvous pouvez utiliser le trait d'union dans la plupart des endroits qui attendent un nom de fichier. C'est un complément évident à <| > IMHO
BSD
4
Je ne suis pas convaincu que ce soit le cas. Tout d’abord, catgère -(consultez la page de manuel). Une version de shell pouvant inclure catou non, mais ce n'est pas strictement le shell entier. De plus, si le shell était manipulé -, vous pourriez dire écho -et cela passerait à autre chose. Au lieu de cela, il fait juste écho à un tiret (pas /dev/stdinou /proc/self/fd/0). Et echo test > -crée simplement un fichier appelé -, de sorte qu'il ne l'utilise clairement pas non plus. Oh, et la page que vous avez listée ne dit pas qu'elle est gérée par le shell , elle dit que vous pouvez l'utiliser avec, catet que les diffdeux comprennent les tirets de manière explicite.
Alexios
14

Dans ce cas, il -est plutôt inutile, si vous utilisez Linux:

GNU tar (la version sous Linux) accepte ses entrées à partir de l'entrée standard par défaut. Si vous ne souhaitez pas ce comportement et souhaitez passer le nom du fichier en tant qu'argument de ligne de commande, vous devez spécifier l'indicateur f:

tar xf filename

Donc, c'est pareil que

tar x < filename

Ou, si l'entrée est gzippée comme dans votre exemple:

gzip -dc filename | tar x

Indiquer le fdrapeau ici n'a aucun sens , mais comme il a été spécifié, le nom de fichier doit être indiqué de manière -à indiquer que nous voulons lire à partir de l'entrée standard (voir autre réponse). Donc, pour répéter, c'est redondant et légèrement étrange.

De plus, la ligne ci-dessus peut être simplifiée car il est possible de dire à GNU tar de transmettre l’entrée par gzipelle-même en spécifiant le zdrapeau:

tar xfz filename

- Pas besoin d'appeler gzipexplicitement.

Konrad Rudolph
la source
1
Remarque: toutes tara l' zoption.
Liori
2
La plupart des systèmes d'exploitation autres que Linux utilisent par tardéfaut le premier lecteur de bande, pour des raisons historiques.
Gilles, arrête de faire le mal
1
@Gilles et BSD, et OS X,…. Mais je suis curieux de savoir: quels autres systèmes, à l'exception de quelques vieux ordinateurs centraux, utilisent encore une telle version (quels systèmes autres que les ordinateurs centraux disposent même d' un lecteur de bande)?
Konrad Rudolph
1
@ KonradRudolph Les trois principaux BSD utilisent par défaut un lecteur de bande ( /dev/sa0sous FreeBSD 9.0, /dev/rst0NetBSD 6.0 et OpenBSD 5.1). La valeur par défaut d’AIX 7.1 est /dev/rmt0. La valeur par défaut de MINIX3 est /dev/sa0. (Dans chaque cas, j’ai vérifié la dernière version du système d’exploitation, il ne s’agit pas d’anciens ordinateurs centraux.) Solaris est configurable par le biais d’un fichier /etcqui, par défaut, est un lecteur de bande. Les commandes tar GNU, Schilling, OSX et BusyBox sont définies par défaut sur stdin / stdout.
Gilles 'SO- arrête d'être méchant'
1
@ Gilles - Je me suis recompilé tarpour utiliser par défaut le deuxième lecteur de bande, pour des raisons évidentes. :)
David Harkness le