Я был в замешательстве, пытаясь скопировать некоторые файлы с одного компьютера на другой. Я понял это, но синтаксис все еще смущает меня. Это работает:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
который кладет Volenteer.png
в папку /home/j0h/b
. Тем не менее, это не работает:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Это также дает сбой, давая статус выхода 1 файл не найден:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
Как это сделать:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Итак , ясно, есть какая - то разница между ~
и ~/
этой разницей наличия/
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
Так почему же в scp ~
решимость ~/
? Это предположение, я не могу проверить, что происходит. Но это кажется противоречивым, а потому и запутанным. Это ошибка в scp? или что-то в тильде мне не хватает?
Ответы:
~
это ваш домашний каталог.~foo
является домашним каталогом пользователяfoo
, если такой пользователь существует, или просто каталогом с именем~foo
, если этого пользователя не существует.Следовательно, в:
~Desktop
будет расширяться до домашнего каталога пользователяDesktop
, если такой пользователь существует (и обычно его нет), или будет просто~Desktop
(путь, который обычно не существует).В:
~/j0h
развернется в каталог с именемj0h
вjay
домашнем каталоге, который, опять же, вряд ли существует.Дело не в том
~
и~/
где разница возникает, а в~
и~foo
.Кроме того,
~
может также использоваться для навигации по истории каталогов:~-
предыдущий рабочий каталог (вроде$OLDPWD
)~+
текущий рабочий каталог (вроде$PWD
)Это не относится к
scp
, так как вы не можете изменить каталоги в серединеscp
операции.И если вы используете
pushd
иpopd
для поддержки стека каталогов, то и будет каталогом в стеке каталогов, как видно из выходных данных . будет каталогом с конца (начиная с нуля, в обоих случаях). Например:~N
~+N
N
dirs
~-N
N
Затем к каталогам в стеке можно получить доступ, используя:
источник
~+
всегда эквивалентно.
тогда, правильно? Кажется излишним.~+
и~-
использовать значения$PWD
и$OLDPWD
, которые являются абсолютными путями..
всегда относительный путь. Итак, если есть команда, которая изменяет текущий рабочий каталог при выполнении, она увидит новый путь, для.
которого путь, расширенный,~-
останется прежним.tar -C
это пример, хотя я признаю, что не могу придумать, как его использовать~+
.$PWD
будет так же хорошо, за исключением того, что вам не нужно заключать в кавычки,~+/foo/bar
если$PWD
содержит пробелы../filename
но можете использовать"$PWD/filename"
или более просто~+/filename
. (И некоторые команды будут работать с относительными путями, но есть функциональные различия, такие какln
илиtar
.)Прочитайте документацию по GNU для Bash Tilde Expansion (как я должен был сделать до моей первой итерации этого ответа).
~/Desktop
и~j0h
делают принципиально разные вещи, что объясняет, почему~Desktop
не работает:Обычная переменная
~
заменяет текущую$HOME
переменную среды, установленную при входе в систему. Так~
разрешается/home/oli
для меня, и~/Desktop
читается как/home/oli/Desktop
. Здесь вы видите, что тильда используется чаще всего.~username
разрешает в дом этого пользователя , как установлено в/etc/passwd
. Так~oli
решает/home/oli
,~j0h
может решить,/home/j0h
но не обязательно, ваш homedir может быть где угодно.~not-a-username
не разрешается ПотомуDesktop
что не пользователь,~Desktop
не подставляется. Он воспринимается буквально как файл или путь с именем~Desktop
(которого здесь нет).И само собой разумеется, все это происходит удаленно (было бы бесполезно,
scp
если бы его заменили локальными значениями). Это работает, потому что Bash не заменит,~...
если ему предшествует что-либо кроме пробела.источник
getent passwd bin
говорит?~dir
согласуется с документацией GNU: «... символы в префиксе тильды, следующие за тильдой, рассматриваются как возможное имя для входа ... Если имя для входа неверное или расширение тильды не удается, слово оставлен без изменений. " Здесьdir
нет имени пользователя в этой системе, поэтому оно остается без изменений.Символ
~
используется в качестве ярлыка для/home/user
inbash
, поэтому в случае~/Desktop/Volenteer.png
него это сокращение для/home/user/Desktop/Volenteer.png
.Итак, как вы можете видеть
/
, как всегда, показывает новый уровень в иерархии файловой системы.источник
~{user}/
может быть любым произвольным путем, заданным файлом базы данных passwd (5). Хотя да, стандарты filesytem.org размещают обычных пользователей в / home, это не относится к каждому пользователю (т. Е. Root в / root и сервисы в / var / ... или более ранних версиях с использованием / usr вместо / home)/usr
.~
является сокращением для переменной среды$HOME
на большинстве производных оболочек c / поддерживающих POSIX-совместимых оболочек. наиболее часто используется для~
ссылки на свой собственный домашний каталог или каталог другого пользователя:Чтобы найти домашний каталог для любого локального пользователя в системе POSIX (UNIX, Linux, OS X, BSD), использующей базу данных passwd (5), запустите awk
/etc/passwd
следующим образом:Это перечислит каждого локального пользователя и его домашний каталог.
источник