Quelle est la magie du «-» (un tiret) dans les paramètres de ligne de commande?

101

Exemples:

  • Créez une image ISO et gravez-la directement sur un CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Passez au répertoire précédent.

    cd -

  • Écoutez sur le port 12345 et décompressez les données qui lui sont envoyées.

    nc -l -p 12345 | tar xvzf -

À quoi sert le tableau de bord et comment l'utiliser?

chemila
la source

Réponses:

111

Si vous voulez dire le nu -à la fin de la tarcommande, c'est courant sur de nombreuses commandes qui souhaitent utiliser un fichier.

Il vous permet de spécifier une entrée ou une sortie standard plutôt qu'un nom de fichier réel .

C'est le cas de votre premier et troisième exemple. Par exemple, la cdrecordcommande prend l'entrée standard (le flux d'image ISO produit par mkisofs) et l'écrit directement dans /dev/dvdrw.

Avec la cdcommande, chaque fois que vous changez de répertoire, elle stocke le répertoire dont vous venez. Si vous utilisez cdle -"nom de répertoire" spécial , il utilise ce répertoire mémorisé au lieu d'un vrai. Vous pouvez facilement basculer entre deux répertoires assez rapidement en utilisant cela.

D'autres commandes peuvent être traitées -comme une valeur spéciale différente .

paxdiablo
la source
9
notez que vous pouvez également utiliser -pour les branches git, c'est-à-dire que vous pouvez revenir à votre branche précédente avecgit checkout -
snappieT
3
Où dans la documentation tar explique-t-il qu'il est pris en charge? Comment savoir quelles commandes le prennent en charge?
1
Si une commande a une signification particulière pour -, vous pouvez trouver son explication dans la page de manuel.
codeforester
su - #make the shell a login shell
atongsa
Je trouve une commande comme celle-ci très curieuse: tar -cvf - / home | aescrypt -e -p pommes -> backup_files.tar.aes qui est en fait tar -cvf - / home | aescrypt -e -p pommes -o backup_files.tar.aes - car le caractère de tuyauterie | devrait rendre inutile la présence du dernier tiret. Mais sans le dernier tiret, la commande échoue. Cela semble illogique. Quelqu'un peut-il s'il vous plaît me donner une référence où la signification du tiret nu dans les lignes de commande est expliquée. Je n'en trouve pas.
elmclose le
22

Ce n'est pas magique. Certaines commandes interprètent -comme l'utilisateur souhaitant lire à partir de stdin ou écrire dans stdout; il n'y a rien de spécial à ce sujet pour le shell.

Ignacio Vazquez-Abrams
la source
9
Sauf dans le cas de cd -; bash(1)poignées cd -comme si vous aviez écrit cd $OLDPWD.
sarnold
6
@sarnold Mais le point est le même, cd- une commande intégrée au shell - interprète un tiret lui-même. Pas de "magie" :-)
2
@pst, bien sûr, pas de magie (c'est juste du code :), mais il y a quelque chose de spécial à ce sujet dans le shell.
sarnold
10

-signifie exactement ce que chaque commande veut que cela signifie. Il existe plusieurs conventions courantes, et vous en avez vu des exemples dans d'autres réponses, mais aucune n'est universelle à 100%.

Il n'y a rien de magique dans le -personnage en ce qui concerne le shell (sauf que le shell lui-même et certaines de ses commandes intégrées comme cdet echo, l'utilisent de manière conventionnelle). Certains personnages, comme \, 'et ", sont "magiques", ayant des significations spéciales partout où ils apparaissent. Ce sont des "métacaractères shell". -n'est pas comme ça.

Pour voir comment une commande donnée utilise -, lisez la documentation de cette commande .

Keith Thompson
la source
7

La magie est dans la convention. Pendant des millénaires, les gens ont utilisé «-» pour distinguer les options des arguments, et ont utilisé «-» dans un nom de fichier pour signifier soit stdin soit stdout, selon le cas. Ne sous-estimez pas le pouvoir de la convention!

William Pursell
la source
Ne surestimez pas la capacité des gens à discerner les manières de parler à partir d'expressions littérales. Cela ne dure pas depuis des millénaires.
tripleee le
1
@tripleee - C'est vrai, mais cela dure depuis des milliards de secondes. ;-)
David R Tribble le
5

Cela signifie utiliser le flux d'entrée standard du programme.

Dans le cas de cd, cela signifie quelque chose de différent: passez au répertoire de travail précédent.

Brian Cain
la source