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?

Tim
la source
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.

Gilles, arrête de faire le mal
la source
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.
cuonglm
la source
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

Lawrence
la source
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
dotancohen
la source
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.

Michael Mrozek
la source
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 :).

gacanepa
la source
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
Chirag Bhatia - chirag64
la source