web-dev-qa-db-fra.com

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

Étant donné la commande suivante:

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

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

82
Eugene S

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 du -f option. Dans les cas où - n'est pas pris en charge, vous pouvez vous en sortir en utilisant quelque chose comme tar xvf /proc/self/fd/0 ou tar xvf /dev/stdin (ce dernier est largement pris en charge dans plusieurs unités).

Ne comptez pas sur cela pour signifier "entrée standard" universellement. Comme il n'est pas interprété par le Shell, chaque programme est libre de le traiter à sa guise. Dans certains cas, c'est standard sortie ou quelque chose de complètement différent: sur su cela signifie ‘démarrer 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 - parce qu'une version d'un programme auquel j'étais habitué ne comprenait pas le tiret.

86
Alexios

Dans ce cas, le - est en fait assez inutile, en supposant que vous utilisez Linux:

GNU tar (la version sous Linux) accepte son entrée à partir de l'entrée standard par défaut. Si vous voulez pas vouloir ce comportement et que vous souhaitez passer le nom de fichier comme argument de ligne de commande, vous devez spécifier l'indicateur f:

tar xf filename

C'est donc la même chose que

tar x < filename

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

gzip -dc filename | tar x

Il n'est pas significatif de spécifier ici l'indicateur f, mais parce qu'il a été spécifié, le nom de fichier doit être donné comme - pour 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 bizarre.

De plus, la ligne ci-dessus peut être simplifiée car GNU tar peut être invité à diffuser l'entrée via gzip lui-même en spécifiant l'indicateur z:

tar xfz filename

- Pas besoin d'appeler gzip explicitement.

14
Konrad Rudolph