Différence entre «cd» et «cd ~»

10

Je me demande, si cd seul m'envoie dans mon dossier personnel et cd ~ fait de même, pourquoi le ~ a-t-il été ajouté en premier lieu alors?

Est-ce quelque chose de spécifique à BASH ou se comporterait-il différemment dans un autre Shell?

Luis Alvarado
la source
2
Certainement pas un doublon. Cette question se pose à propos de cd ~vs cd $HOMEvs cd ~not-tandu. Cette question se pose à propos de cdvs cd ~.

Réponses:

17

Le ~peut être utilisé pour plus que cela. Toute commande peut bénéficier d'un raccourci vers le dossier de départ. Ce n'est donc pas nécessaire si vous voulez entrer dans votre maison, mais qu'en est-il ~/.config?

$ cd ~/.config

Sinon, vous devrez écrire le chemin de la maison, utiliser le $HOMEvar ou faire deux cds. Aussi pour copier ou déplacer des fichiers:

$ cp ~/downloads/some-file some/path/

Comme la plupart de vos fichiers sont à la maison, il est toujours bon d'avoir un raccourci.

ahilsend
la source
Salut ahilsend, en fait ma question est plus orientée vers pourquoi les 2 façons. Je connais déjà ~ l'utilisation de la variable $ HOME mais, dans cet esprit, pourquoi "CD" seul m'envoie-t-il aussi à la maison. Pourquoi 2 voies pour le même but?
Luis Alvarado
4
@CYREX Ma conjecture serait d'économiser la frappe pour le cas très courant de vouloir se déplacer vers votre répertoire personnel.
un CVn le
1
L'autre utilisation de la ~est de faire cd ~user/downloadpour aller dans le répertoire de téléchargement d'un utilisateur.
ott--
5

Faire, cd c'est essentiellement appeler cdsans arguments et conformément au cdcomportement "... si dir n'est pas fourni, la valeur de la variable shell HOME est la valeur par défaut." (extrait du manuel bash ). En revanche, cd ~c'est lorsque vous fournissez un argument à la cdcommande, qui se trouve être ~et le shell effectuera l' expansion du tilde . En ce qui concerne le retour au répertoire personnel de l'utilisateur - il n'y a aucune différence. Dans les deux cas, HOMEla variable d'environnement sera interrogée:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

En fait, cela n'a pas non plus de différence cd $HOME. Cependant, alors que cdfera une seule et unique chose, tilde peut être utilisé pour effectuer d'autres extensions, comme ~+pour le répertoire de travail actuel.

Cependant, il est intéressant de noter que nous pouvons unset HOMErompre, cdmais ~cela fonctionnera toujours:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Pourquoi ? Encore une fois, répondez dans le manuel:

Si HOME n'est pas défini, le répertoire personnel de l'utilisateur exécutant le shell est remplacé à la place. Sinon, le préfixe tilde est remplacé par le répertoire personnel associé au nom de connexion spécifié.

Notez que la suppression est différente de la création d'une variable vide HOME=et a un effet. La documentation parle spécifiquement de la suppression de la variable. Rendre la variable égale à une chaîne vide a un effet contraire à ce que nous attendons:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Ici, vous pouvez voir que la création d' HOMEune chaîne vide rompt à la fois le tilde et le cdcomportement.


Tilde et $HOMEont quelque peu une différence et une raison différente d'existence. $HOMEest une variable shell, qui se trouve également être une des variables d'environnement par coïncidence - et qui est disponible pour tous les programmes; en C, vous utiliseriez environ()pour y accéder. En revanche, tildeest une syntaxe spécifique au shell qui effectue une expansion tilde, bien que vous puissiez également utiliser la wordexp()fonction pour effectuer une expansion de type shell ( référence ) en C.

La raison pour laquelle ~représente HOMEa été répondu dans cette question : il était une fois le caractère tilde partagé la même clé avec HOMEsur le terminal Lear-Siegler ADM-3A. HOMEen revanche, c'est une variable d'environnement qui avait une signification purement symbolique et aucune représentation physique.

De plus, le fait qu'il HOMEs'agisse d'une variable d'environnement nous permet de la désactiver, alors que nous ne pouvons pas définir ~autre chose par des moyens simples.

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Remarquez la ligne vide où echosort la première variable non définie, et le fait que. En revanche, nous ne pouvons pas faire des trucs comme ça pour tilde:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Cependant, la modification HOMEaffecte ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

De plus, car ~fonctionne également comme caractère d'extension, nous pouvons faire des choses comme ceci pour afficher le répertoire de travail actuel:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Alors que si nous voulons le faire via des variables d'environnement, nous avons besoin PWDet HOMEreste le même, ou si vous faites des choses comme echo $HOME+- c'est simplement une concaténation chaîne / variable. Mais encore une fois, ~+supprime les informations des variables d'environnement:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

REMARQUE : les extensions ~+et ~-fonctionnent dans ksh, mais pas dans dash.


Pour répondre à certaines de vos questions spécifiques:

Est-ce quelque chose de spécifique à BASH ou se comporterait-il différemment dans un autre Shell?

Non, cela devrait être un comportement cohérent. ksh, dashEt csh- tous se comportent même avec cdou cd ~.

pourquoi le ~ a-t-il été ajouté en premier lieu alors?

Je dirais la commodité et les raisons historiques comme expliqué dans la réponse liée à propos du tilde. Finalement, il a grandi pour effectuer plus qu'une simple expansion du répertoire personnel.

Sergiy Kolodyazhnyy
la source
0

Peu importe si vous êtes plusieurs niveaux de dossier ci - dessus ou au- dessous $HOME, les commandes cdet cd ~faire la même chose et ne diffèrent pas - il vous renvoyer à votre répertoire.

CEPENDANT: lorsque vous êtes 1 ou plusieurs niveaux de dossier au-dessus de HOME et que vous souhaitez accéder DIRECTEMENT à un sous-répertoire 1 ou plusieurs niveaux de dossier ci $HOME- dessous , le tilde ( ~) est utile en vous épargnant des touches lorsqu'il est utilisé pour remplacer le texte nécessaire pour faire référence à $HOMElors de la saisie d'une cdcommande. Par exemple;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
P Alexander
la source
0

~ signifie / home / nom d'utilisateur, donc vous gagnez du temps lors de la frappe. Par exemple, cd / home / nom d'utilisateur / Téléchargements est identique à cd ~ / Downloads, mais moins de frappe. Les deux commandes font de même, changez le répertoire de travail à cet emplacement.

Ionut
la source
Pas vraiment. Par exemple, rootle répertoire personnel est généralement à l'extérieur/home
Dmitry Grigoryev