Différence entre “cd -” et “cd ~ -”

56

La commande Bash

cd - 

imprime le répertoire précédemment utilisé et y apporte des modifications.

D'autre part, la commande Bash

cd ~-

modifie directement le répertoire précédemment utilisé, sans rien répercuter.

Est-ce la seule différence? Quel est le cas d'utilisation de chacune des commandes?

dr01
la source
3
Je vous recommande de ne pas utiliser ce genre de choses délicates. Ceci est votre cerveau cd ~-.
DepressedDaniel
10
@DepressedDaniel, même si vous ne prévoyez pas utiliser de trucs épineux, il est toujours utile de comprendre ce qui se passe dans les coulisses - comprendre les cas de coin peut vous sortir du trou plus tard lorsque vous essayez de déboguer quelque chose de différent.
AnotherDave

Réponses:

81

Il y a deux choses en jeu ici. Tout d'abord, le -seul est étendu à votre répertoire précédent. Ceci est expliqué dans la cdsection de man bash(souligné par moi):

Un argument de -est converti en $ OLDPWD avant la tentative de modification du répertoire. Si un nom de répertoire non vide de CDPATH est utilisé ou s'il -s'agit du premier argument et que le changement de répertoire a abouti, le chemin absolu du nouveau répertoire de travail est écrit dans la sortie standard. La valeur de retour est true si le répertoire a été modifié avec succès; faux sinon.

Ainsi, un simple cd -vous ramènera à votre répertoire précédent et imprimera le nom du répertoire. L'autre commande est documentée dans la section "Extension de tilde":

Si le préfixe tilde est a ~+, la valeur de la variable shell PWD remplace le préfixe tilde. Si le préfixe tilde est a ~-, la valeur de la variable shell OLDPWD, si elle est définie, est remplacée. Si les caractères suivant le tilde dans le préfixe tilde se composent d’un nombre N, éventuellement préfixé par un +ou un -, le préfixe tilde est remplacé par l’élément correspondant de la pile de répertoires, tel qu’il serait affiché par les répertoires internes invoqués avec le préfixe tilde comme argument. Si les caractères suivant le tilde dans le préfixe tilde consistent en un nombre sans préfixe +ou -, +est supposé.

Cela pourrait être plus facile à comprendre avec un exemple:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Donc, en général, cela -signifie "le répertoire précédent". C’est pourquoi, cd -par lui-même, vous pourrez revenir où que vous soyez.

La principale différence est que cela cd -est spécifique à la fonction cdintégrée. Si vous essayez, echo -cela imprimera simplement un -. Le ~-fait partie de la fonctionnalité d'extension tilde et se comporte de la même manière qu'une variable. C'est pourquoi vous pouvez echo ~-et obtenir quelque chose de significatif. Vous pouvez également l'utiliser, cd ~-mais vous pouvez également l'utiliser dans toute autre commande. Par exemple, cp ~-/* .ce qui équivaudrait àcp "$OLDPWD"/* .

terdon
la source
1
set -ximprimer la commande développée avant de l'exécuter peut être utile pour illustrer la différence (ou peut-être simplement trop bruyant lorsque vous ne le faites pas vous-même, étape par étape).
Peter Cordes
1
@terdon aujourd'hui j'ai appris.
sitilge
En bref ... ça cd ~-/..marche cd -/..pas!
Ray Foss
13

~-est sujet à l'expansion du tilde (voir man bash), donc ce qui cdest vu est le nom du répertoire précédent directement. -n'est pas développé par le shell, le cdvoit directement et se comporte comme indiqué:

Un argument de - est équivalent à $ OLDPWD. Si un nom de répertoire non vide à partir de CDPATH est utilisé ou si - est le premier argument et que la modification de répertoire a réussi, le chemin absolu du nouveau répertoire de travail est écrit dans la sortie standard.

choroba
la source
4

TL; DR: cd -est intégré à cd, ~-est une extension ultérieure de ~[name], non spécifique à cd.

POSIX.1-2008 Shell & Utilities définit cd -comme un cas spécial spécifique à la cdcommande :

Quand a -est utilisé comme opérande, cela doit être équivalent à la commande:

cd "$OLDPWD" && pwd

qui change dans le répertoire de travail précédent, puis écrit son nom.

L' ~-extension sera développée $OLDPWDavant toute commande et peut être transmise comme argument d'une commande, pas seulement cd. C'est une extension ultérieure en et .

La norme POSIX.1-2008 Shell & Utilities susmentionnée contient également une explication détaillée de l’extension Tilde . La formulation est très spécifique pour permettre ~-un comportement indéfini dans le champ d'application de la norme, où ~[name]fait référence à $HOMEsi [name]est la chaîne vide, ou au répertoire de base de l'utilisateur namesi nameest un nom d'utilisateur valide.

Henk Langeveld
la source