J'étais confus, essayant de copier certains fichiers d'un PC à un autre. Je l'ai compris, mais la syntaxe me prête toujours à confusion. Cela marche:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
qui met Volenteer.png
dans le dossier /home/j0h/b
. Cependant, cela ne fonctionne pas:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Cela échoue également, donnant un fichier de statut de sortie 1 introuvable:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
Comme cela:
scp ~Desktop/Volenteer.png jay@server.ip:~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 en scp, la ~
résolution est-elle de ~/
? 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?
Réponses:
~
est votre répertoire personnel.~foo
est le répertoire personnel de l'utilisateurfoo
, si un tel utilisateur existe, ou simplement un répertoire nommé~foo
, si cet utilisateur n'existe pas.Par conséquent, dans:
~Desktop
sera étendu au répertoire personnel de l'utilisateurDesktop
, si un tel utilisateur existe (et il n'existe généralement pas), ou s'il est juste~Desktop
(un chemin qui n'existe généralement pas non plus).Dans:
~/j0h
va se développer dans un répertoire nomméj0h
dansjay
le répertoire personnel de, qui, encore une fois, est peu probable.Ce n'est pas
~
et~/
où la différence se produit, mais dans~
et~foo
.En outre,
~
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
)Cela ne s'applique pas à
scp
, car vous ne pouvez pas changer de répertoire au milieu d'unescp
opération.Et si vous utilisez
pushd
etpopd
pour maintenir une pile de répertoires, et serait le répertoire th dans la pile de répertoires, comme on le voit dans la sortie de . serait le répertoire th de la fin (en comptant à partir de zéro, dans les deux cas). Par exemple:~N
~+N
N
dirs
~-N
N
Ensuite, les répertoires de la pile sont accessibles en utilisant:
la source
~+
est toujours équivalent à.
alors, n'est-ce pas? Semble redondant.~+
et~-
utilisez les valeurs de$PWD
et$OLDPWD
, qui sont des chemins absolus..
est toujours un chemin relatif. Donc, s'il y a une commande qui change le répertoire de travail actuel lors de l'exécution, elle verra le nouveau chemin pour.
, où le chemin développé par~-
restera le même.tar -C
est un exemple, bien que j'avoue que je ne peux pas penser à une bonne utilisation pour~+
.$PWD
serait tout aussi bon, sauf que vous n'avez pas besoin de citer~+/foo/bar
si$PWD
contient des espaces../filename
mais pouvez utiliser"$PWD/filename"
ou plus simplement~+/filename
. (Et certaines commandes fonctionneront sur les chemins d'accès relatifs mais il y a une différence fonctionnelle, commeln
outar
.)Lisez la documentation GNU pour Bash Tilde Expansion (comme je devrais l'avoir avant ma première itération de cette réponse).
~/Desktop
et~j0h
font des choses fondamentalement différentes, ce qui explique pourquoi~Desktop
cela ne fonctionne pas:Un simple
~
est substitué à votre$HOME
variable d'environnement actuelle , définie lors de la connexion. Donc ,~
décide de/home/oli
pour moi, et se~/Desktop
lit comme/home/oli/Desktop
. C'est là que vous voyez le tilda le plus utilisé.~username
se résout au domicile de cet utilisateur , comme indiqué dans/etc/passwd
. Donc ,~oli
décide de/home/oli
,~j0h
peut résoudre à/home/j0h
mais pas neccessarily, votre homedir peut être partout.~not-a-username
ne résout pas. Parce queDesktop
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
scp
s'il était remplacé par des valeurs locales). Cela fonctionne parce que Bash ne se substituera pas~...
s'il est précédé par autre chose que des espaces.la source
getent passwd bin
dit-on?~dir
est cohérent avec les documents GNU: "... les caractères dans le préfixe tilde suivant le tilde sont traités comme un nom de connexion possible ... Si le nom de connexion n'est pas valide, ou l'expansion du tilde échoue, le mot reste inchangé. " Ici, cedir
n'est pas le nom d'un utilisateur sur ce système, donc il reste inchangé.Le symbole
~
est utilisé comme raccourci pour/home/user
dansbash
, donc dans le cas où~/Desktop/Volenteer.png
il est raccourci pour/home/user/Desktop/Volenteer.png
.Comme vous pouvez le voir, le
/
, comme toujours, montre un nouveau niveau dans la hiérarchie du système de fichiers.la source
~{user}/
pourrait simplement être n'importe quel chemin aléatoire défini par le fichier de base de données passwd (5). Bien que oui, les normes filesytem.org placent des utilisateurs réguliers dans / home, ce n'est pas le cas pour tous les utilisateurs (c'est-à-dire root dans / root, et services dans / var / ... ou des unixies plus anciens utilisant / usr au lieu de / home)/usr
.~
est un raccourci pour la variable d'environnement$HOME
sur la plupart des dérivés de shell c / prenant en charge les shells conformes POSIX. l'utilisation la plus courante pour le~
référencement de votre propre répertoire personnel ou de celui d'un autre utilisateur:Pour trouver le répertoire personnel de tout utilisateur local sur un système POSIX (UNIX, Linux, OS X, BSD) qui utilise la base de données passwd (5), exécutez awk
/etc/passwd
comme ceci:Cela répertoriera chaque utilisateur local et son répertoire personnel.
la source