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?
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?
Réponses:
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 $HOME
var ou faire deux cd
s. 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.
~
est de faire cd ~user/download
pour aller dans le répertoire de téléchargement d'un utilisateur.
Faire, cd
c'est essentiellement appeler cd
sans arguments et conformément au cd
comportement "... 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 cd
commande, 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, HOME
la 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 cd
fera 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 HOME
rompre, cd
mais ~
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' HOME
une chaîne vide rompt à la fois le tilde et le cd
comportement.
Tilde et $HOME
ont quelque peu une différence et une raison différente d'existence. $HOME
est 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, tilde
est 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 HOME
a été répondu dans cette question : il était une fois le caractère tilde partagé la même clé avec HOME
sur le terminal Lear-Siegler ADM-3A. HOME
en revanche, c'est une variable d'environnement qui avait une signification purement symbolique et aucune représentation physique.
De plus, le fait qu'il HOME
s'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ù echo
sort 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 HOME
affecte ~
:
$ 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 PWD
et HOME
reste 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
, dash
Et csh
- tous se comportent même avec cd
ou 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.
Peu importe si vous êtes plusieurs niveaux de dossier ci - dessus ou au- dessous $HOME
, les commandes cd
et 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 à $HOME
lors de la saisie d'une cd
commande. 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
~ 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.
root
le répertoire personnel est généralement à l'extérieur/home
cd ~
vscd $HOME
vscd ~not-tandu
. Cette question se pose à propos decd
vscd ~
.