Ich war verwirrt, als ich versuchte, einige Dateien von einem PC auf einen anderen zu kopieren. Ich habe es herausgefunden, aber die Syntax ist für mich immer noch verwirrend. Das funktioniert:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
was Volenteer.png
in den Ordner legt /home/j0h/b
. Dies funktioniert jedoch nicht:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Dies schlägt ebenfalls fehl und gibt eine Exit-Status-1-Datei an, die nicht gefunden wurde:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
Wie geht das:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Also klar, es gibt einen Unterschied zwischen ~
und ~/
Dieser Unterschied ist die Gegenwart von/
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
Also warum in scp, löst das ~
auf ~/
? Das ist eine Vermutung, ich kann nicht bestätigen, dass es das ist, was passiert. Aber es scheint inkonsistent und daher verwirrend. Ist das ein Fehler in SCP? oder fehlt mir etwas an tilde?
Antworten:
~
ist Ihr Heimatverzeichnis.~foo
ist das Ausgangsverzeichnis des Benutzersfoo
, wenn ein solcher Benutzer vorhanden ist, oder nur ein Verzeichnis mit dem Namen~foo
, wenn dieser Benutzer nicht vorhanden ist.Daher in:
~Desktop
wird zum Ausgangsverzeichnis des Benutzers erweitertDesktop
, wenn ein solcher Benutzer vorhanden ist (und dies normalerweise nicht der Fall ist) oder nur~Desktop
(ein Pfad, der normalerweise auch nicht vorhanden ist).Im:
~/j0h
wird zu einem Verzeichnis mit dem Namenj0h
im Ausgangsverzeichnis erweitertjay
, das ebenfalls wahrscheinlich nicht vorhanden ist.Es ist nicht
~
und~/
wo der Unterschied auftritt, sondern in~
und~foo
.Darüber hinaus
~
kann auch für Verzeichnis Geschichte Navigation verwendet werden:~-
ist das vorherige Arbeitsverzeichnis (like$OLDPWD
)~+
ist das aktuelle Arbeitsverzeichnis (like$PWD
)Dies gilt nicht für
scp
, da Sie nicht während einesscp
Vorgangs die Verzeichnisse wechseln müssen .Und wenn Sie
pushd
und verwendenpopd
, um einen Verzeichnisstapel zu pflegen, und das th-Verzeichnis im Verzeichnisstapel wäre, wie in der Ausgabe von zu sehen . wäre das th-Verzeichnis vom Ende (in beiden Fällen von Null an gezählt). Beispielsweise:~N
~+N
N
dirs
~-N
N
Anschließend kann auf die Verzeichnisse im Stapel zugegriffen werden, indem Folgendes verwendet wird:
quelle
~+
also immer gleichbedeutend mit dem.
, was? Scheint überflüssig.~+
und~-
benutze die Werte von$PWD
und$OLDPWD
, die absolute Pfade sind..
ist immer ein relativer Pfad. Wenn es also einen Befehl gibt, der beim Ausführen das aktuelle Arbeitsverzeichnis ändert, wird der neue Pfad für angezeigt.
, wobei der Pfad, um den erweitert wurde~-
, der gleiche bleibt.tar -C
ist ein Beispiel, obwohl ich zugebe, dass ich mir keine gute Verwendung für vorstellen kann~+
.$PWD
wäre genauso gut, außer dass Sie nicht zitieren müssen,~+/foo/bar
wenn$PWD
Leerzeichen enthält../filename
, können aber"$PWD/filename"
oder einfacher verwenden~+/filename
. (Und einige Befehle funktionieren bei relativen Pfadnamen, aber es gibt einen funktionalen Unterschied, wie z. B.ln
odertar
.)Lesen Sie sich die GNU-Dokumentation für Bash Tilde Expansion durch (wie ich es vor meiner ersten Iteration dieser Antwort hätte tun sollen).
~/Desktop
und~j0h
machen grundsätzlich andere Dinge, was erklärt, warum~Desktop
nicht funktioniert:Die
~
aktuelle$HOME
Umgebungsvariable wird durch eine Ebene ersetzt , die beim Anmelden festgelegt wird. Also~
beschließt/home/oli
für mich, und~/Desktop
liest als/home/oli/Desktop
. Hier sehen Sie die Tilda, die am häufigsten verwendet wird.~username
wird in das Haus dieses Benutzers aufgelöst , wie in festgelegt/etc/passwd
. So~oli
Entschlüssen zu/home/oli
,~j0h
lösen könnte ,/home/j0h
aber nicht notwendigerweise, kann Ihr homedir überall sein.~not-a-username
löst sich nicht auf. WeilDesktop
kein Benutzer ist,~Desktop
wird nicht ersetzt. Es wird wörtlich als eine Datei oder ein Pfad mit dem Namen~Desktop
(der hier nicht existiert) verstanden.Und natürlich geschieht dies alles aus der Ferne (es wäre nutzlos,
scp
wenn es durch lokale Werte ersetzt würde). Dies funktioniert, weil Bash nichts ersetzt,~...
wenn ihm nur Leerzeichen vorangestellt sind.quelle
getent passwd bin
heißt das?~dir
steht im Einklang mit den GNU-Dokumenten: "... die Zeichen im Tilde-Präfix, die auf die Tilde folgen, werden als möglicher Anmeldename behandelt ... Wenn der Anmeldename ungültig ist oder die Tilde-Erweiterung fehlschlägt, das Wort bleibt unverändert. " Istdir
hier nicht der Name eines Benutzers auf diesem System, so bleibt er unverändert.Das Symbol
~
wird als Abkürzung für/home/user
in verwendetbash
, ist also in diesem Fall~/Desktop/Volenteer.png
eine Abkürzung für/home/user/Desktop/Volenteer.png
.Wie Sie sehen
/
, zeigt das wie immer eine neue Ebene in der Dateisystemhierarchie.quelle
~{user}/
Dies kann ein beliebiger Pfad sein, wie er in der Datenbankdatei passwd (5) festgelegt ist. Während ja, die filesytem.org-Standards reguläre Benutzer in / home platzieren, ist dies nicht bei jedem Benutzer der Fall (dh root in / root und Dienste in / var / ... oder älteren Unixies, die / usr anstelle von / home verwenden)./usr
.~
ist eine Abkürzung für die Umgebungsvariable$HOME
auf den meisten C-Shell-Derivaten / unterstützenden POSIX-kompatiblen Shells. Die gebräuchlichste Verwendung~
ist, wenn Sie auf Ihr eigenes Heimverzeichnis oder das eines anderen Benutzers verweisen:Um das Home-Verzeichnis für einen lokalen Benutzer auf einem POSIX-System (UNIX, Linux, OS X, BSD) zu finden, das die passwd (5) -Datenbank verwendet, führen Sie awk on folgendermaßen aus
/etc/passwd
:Dies listet jeden lokalen Benutzer und sein Ausgangsverzeichnis auf.
quelle