Est-ce que `-` est utilisé uniquement avec cd?


45

cd - peut basculer entre le répertoire actuel et le répertoire précédent.

Il semble que j’ai déjà -utilisé des arguments pour d’autres commandes, même si je ne me souviens pas si -signifie la même chose que pour cd.

J'ai trouvé que -ça ne marche pas avec ls.

Est - utilisé uniquement avec cd?


8
Il convient de garder à l’esprit que cdc’est une commande intégrée, et non une commande externe (elle n’aurait aucun moyen de fonctionner comme telle). cd -est donc une fonctionnalité au niveau du shell.
— moelleux

6
J'utilise tout le temps git checkout -pour passer à la branche précédente
— wim

@ Fluffy: Sont -utilisés avec d'autres éléments intégrés de la même manière?
— Tim

Pour certaines fonctions intégrées de gestion de répertoire telles que pushd, oui. Sinon, la signification de "le répertoire précédent" n’est pas un défaut extrêmement utile.
— moelleux

1
Vous pensez peut-être à la fonctionnalité '~ -' de bash (qui est interprétée comme $ OLDPWD). Cela peut être utilisé avec 'ls' de la manière que vous décrivez.
— Abonet

Réponses:


22

Les instructions relatives à la syntaxe de l'utilitaire POSIX (en particulier le numéro 13) spécifient que, pour les utilitaires qui attendent un nom de fichier à partir duquel lire, -signifie une entrée standard, et pour ceux qui attendent qu'un nom de fichier soit écrit, -signifie une sortie standard. Par exemple, cat somefile -copie le contenu de somefilesur sa sortie standard, suivi de ce qu'il lit sur son entrée standard.

Cette directive ne s'applique pas à la cdcommande car elle ne lit ni n'écrit dans un fichier. cdfait quelque chose de différent: l'argument -signifie “le répertoire précédent”. La commande cd -est équivalente à cd "$OLDPWD" && pwd. Ce comportement est spécifique à la cdcommande et aux commandes directement inspirées telles que pushd.

Notez que -c'est un opérande, pas une option. Seuls les arguments qui commencent par -et ne sont pas simplement -ou --sont des options. La principale implication d'être un opérande est que cela --n'affecte pas sa signification particulière. Par exemple, les cd -- -Pmodifications apportées à un sous-répertoire appelé -P, mais cd -- -identique à cd -, ne sont pas remplacées par un répertoire appelé -. De même, cat -- -ne lit pas à partir d'un fichier appelé -mais à partir d'une entrée standard.


46

-est défini dans les instructions de syntaxe POSIX Utility en tant qu’entrée standard:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Vous pouvez voir cette définition pour les utilitaires qui fonctionnent avec des fichiers en lecture ou en écriture. cdn'appartient pas à ces utilitaires, donc -dans cd ne suit pas cette directive.

De plus, POSIX a aussi -sa propre signification avec cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.

36

cd -est en fait un raccourci pour cd "$OLDPWD" && pwd, où $OLDPWDest défini chaque fois que vous changez de répertoire pour le répertoire dans lequel vous étiez juste.

Le traitement -dépend de l'application. Certaines applications utilisent -pour signifier STDIN, par exemple grep,awk

D’autres applications peuvent utiliser -comme raccourci pour tout ce qu’elles choisissent, comme le précise la réponse de Michael, avec su, -raccourci pour--login


oui en effet il n'y a pas de règle pour ça.
— Kiwy

2
@ Kiwy: Avec POSIX, il existe une règle pour cela, voir ma réponse.
— jeudi

Pour être précis, il y a une règle générale, mais il y a beaucoup d'exceptions. Il existe également de nombreuses commandes antérieures à la règle ou d'anciennes implémentations qui n'ont pas été mises à jour pour se conformer à la règle.
— Barmar

19

Bien que Michael mentionne que suet d' autres applications peuvent utiliser -pour signifier ce qu'ils veulent (lire stdin est commun), Git utilise - t -d'une manière similaire à la façon dont le cdfait , pour changer les branches.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

N'importe quel programme peut utiliser -comme argument, pour signifier ce qu'ils veulent. Un exemple courant est celui suqui utilise -comme raccourci pour --login. La seule convention à laquelle je puisse penser est que les programmes qui lisent des fichiers utilisent souvent le -mot "lire à partir de stdin" , mais que cela dépend entièrement du programme.


Existe-t-il des conventions standard ou non standard pour l'utilisation de symboles spéciaux comme arguments?
— Tim

2

Ajout de mes deux cents ici. J'utilise '-' pour indiquer à l'outil ps2pdf de lire à partir d'une entrée standard, comme plusieurs personnes l'ont suggéré précédemment:

man -t ls | ps2pdf - ls.pdf

Le one-liner ci-dessus crée une version pdf de la page de manuel de ls dans le répertoire en cours.
J'espère que quelqu'un le trouvera utile :).


2

Comme l'a répondu gnouc , -a sa propre signification dans cd.

Cependant, vous pouvez reproduire le comportement de -dans d'autres programmes utilisant ~-. Par exemple:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
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.