J'étais confus, en essayant de copier certains fichiers d'un PC à un autre. Je l'ai compris, mais la syntaxe est encore déroutante pour moi. Cela marche:
scp ~/Desktop/Volenteer.png [email protected]:~j0h/b
qui place Volenteer.png
dans le dossier /home/j0h/b
. Cependant, cela ne fonctionne pas:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
Cela échoue également, donnant un fichier d'état de sortie 1 introuvable:
scp ~/Desktop/Volenteer.png [email protected]:~/j0h/b
Comme le fait ceci:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
Donc, clairement, il y a une différence entre ~
et ~/
Cette différence est la présence de /
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
Alors pourquoi dans scp, le ~
at-il été résolu en ~/
? C'est une supposition, je ne peux pas vérifier que c'est ce qui se passe. Mais cela semble incohérent et donc déroutant. Est-ce un bug dans scp? ou y a-t-il quelque chose à propos de tilde qui me manque?
~
est votre répertoire personnel.
~foo
est le répertoire de base de l'utilisateur foo
, si un tel utilisateur existe, ou simplement un répertoire nommé ~foo
, si cet utilisateur n'existe pas.
Par conséquent, dans:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
~Desktop
sera étendu au répertoire de base de l'utilisateur Desktop
, si un tel utilisateur existe (et ce n'est généralement pas le cas), ou sera simplement ~Desktop
(un chemin qui n'existe généralement pas non plus).
Dans:
scp ~/Desktop/Volenteer.png [email protected]:~/j0h/b
~/j0h
sera étendu à un répertoire nommé j0h
dans le répertoire de base de jay
, qui, encore une fois, a peu de chance d’exister.
Ce n'est pas ~
et ~/
où la différence se produit, mais dans ~
et ~foo
.
De plus, ~
peut également être utilisé pour la navigation dans l'historique des répertoires:
~-
est le répertoire de travail précédent (comme $OLDPWD
)~+
est le répertoire de travail actuel (comme $PWD
)Ceci ne s'applique pas à scp
, car vous ne pouvez pas changer de répertoire au milieu d'une opération scp
.
Et si vous utilisez pushd
ET popd
pour maintenir une pile de répertoires, ~N
et ~+N
serait le N
répertoire dans la pile de répertoires, comme indiqué dans la sortie de dirs
. ~-N
serait le N
ème répertoire de la fin (compte à partir de zéro, dans les deux cas). Par exemple:
$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim
$ dirs
/tmp /var /usr /etc ~/.vim
Ensuite, les répertoires de la pile sont accessibles via:
/tmp /var /usr /etc ~/.vim
~0 ~1 ~2 ~3 ~4
~+0 ~+1 ~+2 ~+3 ~+4
~-4 ~-3 ~-2 ~-1 ~-0
~+ ~-
Lisez attentivement le documentation GNU pour Bash Tilde Expansion (comme je le devrais avant la première itération de cette réponse).
~/Desktop
et ~j0h
font des choses fondamentalement différentes, ce qui explique pourquoi ~Desktop
ne fonctionne pas:
Un ~
simple est substitué à votre variable d’environnement actuelle $HOME
, définie lors de la connexion. Donc, ~
est résolu en /home/oli
pour moi, et ~/Desktop
se lit comme /home/oli/Desktop
. C'est là que vous voyez le plus souvent utiliser tilda.
~username
résout à la maison de cet utilisateur , comme défini dans /etc/passwd
. Donc, ~oli
est résolu en /home/oli
, ~j0h
peut être résolu en /home/j0h
mais pas nécessairement, votre répertoire de départ peut être n'importe où.
~not-a-username
ne résout pas. Étant donné que Desktop
n'est pas un utilisateur, ~Desktop
n'est pas substitué. Il est pris littéralement comme un fichier ou un chemin nommé ~Desktop
(qui n'existe pas ici).
Et il va sans dire que tout cela se passe à distance (cela serait inutile dans scp
si elle était remplacée par des valeurs locales). Cela fonctionne parce que Bash ne substituera pas ~...
s'il est précédé par autre chose que des espaces.
Le symbole ~
est utilisé comme raccourci pour /home/user
dans bash
. Ainsi, dans le cas de ~/Desktop/Volenteer.png
, il est abrégé pour /home/user/Desktop/Volenteer.png
.
Comme vous pouvez le constater, le /
indique, comme toujours, un nouveau niveau dans la hiérarchie du système de fichiers.
~
est un raccourci pour la variable d'environnement $HOME
de la plupart des shells c dérivés/shell Shell compatibles. L’utilisation la plus courante de ~
consiste à référencer votre propre répertoire personnel ou celui de la maison d’un autre utilisateur:
cd ~ # ie Shell, take me to my home folder
cd ~root # i.e. Shell, take me to root's home folder
Pour trouver le répertoire de base de tout utilisateur local sur un système POSIX (UNIX, Linux, OS X, BSD) utilisant le passwd (5) , exécutez awk sur /etc/passwd
de la manière suivante:
awk -F: '{ print $1,$(NF-1) }' /etc/passwd
Ceci listera chaque utilisateur local et son répertoire personnel.