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

29

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 fonctionne:

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 cela:

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

Il est donc clair qu'il existe 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 ~ se résout-il 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?

    
posée j0h 05.08.2015 - 15:42
la source

4 réponses

66

~ 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 personnel de jay , qui, une fois encore, a peu de chances d’exister.

Ce n'est pas ~ et ~/ où la différence se produit, mais en ~ 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 conserver une pile de répertoires, ~N et ~+N serait le N ème répertoire de la pile de répertoires, comme indiqué dans la sortie de dirs . ~-N serait le N ème répertoire de la fin (à 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 à l'aide de:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-
    
réponse donnée muru 05.08.2015 - 16:12
la source
21

Lisez attentivement la documentation GNU pour l'extension du tilde Bash ( comme je le devrais avant ma 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 ~ remplace votre variable d'environnement actuelle $HOME , définie lors de la connexion. Donc, ~ se résout en /home/oli pour moi et ~/Desktop se lit comme /home/oli/Desktop . C’est là que vous voyez le tilda le plus utilisé.

  • ~username est résolu au domicile de cet utilisateur , comme indiqué 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 (ce serait inutile dans scp si cela était remplacé par des valeurs locales). Cela fonctionne car Bash ne substituera pas ~... s'il est précédé par autre chose que des espaces.

    
réponse donnée Oli 05.08.2015 - 15:54
la source
4

Le symbole ~ est utilisé comme raccourci pour /home/user dans bash . Ainsi, dans le cas de ~/Desktop/Volenteer.png , il est un raccourci pour /home/user/Desktop/Volenteer.png .

Comme vous pouvez le voir, / , comme toujours, affiche un nouveau niveau dans la hiérarchie du système de fichiers.

    
réponse donnée Mark Kirby 05.08.2015 - 15:49
la source
4

~ est un raccourci pour la variable d'environnement $HOME sur la plupart des dérivés du shell c / prenant en charge des shells compatibles POSIX. L'utilisation la plus courante de ~ est utilisée pour référencer votre propre répertoire de base 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 rechercher le répertoire de base de tout utilisateur local situé sur un système POSIX (UNIX, Linux, OS X, BSD) utilisant le passwd (5) base de données exécutée avec awk sur /etc/passwd comme ceci:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

Ceci listera chaque utilisateur local et son répertoire personnel.

    
réponse donnée Dwight Spencer 05.08.2015 - 21:17
la source

Lire d'autres questions sur les étiquettes