web-dev-qa-db-fra.com

Comment utiliser le tilde comme raccourci vers mon répertoire personnel?

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?

29
j0h

~ 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 
  ~+   ~-
66
muru

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.

21
Oli

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.

4
Mark Kirby

~ 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.

3
Dwight Spencer