Я был смущен, пытаясь скопировать некоторые файлы от одного ПК до другого. Мне выяснили его, но синтаксис все еще сбивает с толку меня. Это работает:
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
, если тот пользователь не существует.
Следовательно, в:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
~Desktop
расширится до корневого каталога пользователя Desktop
, если такой пользователь существует (и это обычно не делает), или справедливы ~Desktop
(путь, который обычно не существует ни один).
В:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
~/j0h
расширится до названного каталога j0h
в jay
корневой каталог, который, снова, вряд ли будет существовать.
Это не ~
и ~/
где различие происходит, но в ~
и ~foo
.
Кроме того, ~
может также использоваться для навигации истории каталога:
~-
предыдущий рабочий каталог (как $OLDPWD
)~+
текущий рабочий каталог (как $PWD
)Это не применимо к scp
, так как Вы не добираетесь для изменения каталогов посреди scp
операция.
И если Вы используете pushd
и popd
поддержать стопку каталога, ~N
и ~+N
был бы N
каталог th в стопке каталога, как замечено в выводе dirs
. ~-N
был бы N
каталог th от конца (рассчитывающий от нуля, в обоих случаях). Например:
$ 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
Затем с помощью каталоги в стеке можно получить доступ:
/tmp /var /usr /etc ~/.vim
~0 ~1 ~2 ~3 ~4
~+0 ~+1 ~+2 ~+3 ~+4
~-4 ~-3 ~-2 ~-1 ~-0
~+ ~-
Символ ~
используется в качестве ярлыка для /home/user
в bash
, таким образом, в случае ~/Desktop/Volenteer.png
это - сокращение от /home/user/Desktop/Volenteer.png
.
Поэтому, как Вы видите эти /
, как всегда, показывает новый уровень в иерархии файловой системы.
~
сокращение от переменной среды $HOME
на большей части производной/поддержки оболочки c POSIX совместимые оболочки. наиболее популярный способ использования ~
при ссылке на собственный корневой каталог или тот из дома другого пользователя:
cd ~ # ie shell, take me to my home folder
cd ~root # i.e. shell, take me to root's home folder
Для нахождения корневого каталога для любого локального пользователя в системе POSIX (UNIX, Linux, OS X, BSD), который использует passwd (5) база данных выполненный awk на /etc/passwd
как так:
awk -F: '{ print $1,$(NF-1) }' /etc/passwd
Это перечислит каждого локального пользователя и их корневой каталог.
Имейте чтение через документации GNU для Расширения Тильды Bash (как я должен иметь перед своим первым повторением этого ответа).
~/Desktop
и ~j0h
делают существенно разные вещи, который объясняет почему ~Desktop
не работает:
Плоскость ~
заменен Ваш ток $HOME
переменная среды, установленная на входе в систему. Так ~
твердость к /home/oli
для меня, и ~/Desktop
чтения как /home/oli/Desktop
. Это - то, где Вы видите, что tilda используется больше всего.
~username
твердость в дом того пользователя, как начато /etc/passwd
. Так ~oli
твердость к /home/oli
, ~j0h
мог бы разрешить /home/j0h
но не обязательно, Ваш homedir может быть где угодно.
~not-a-username
не решает. Поскольку Desktop
не пользователь, ~Desktop
не заменен. Это взято буквально в качестве файла или названного пути ~Desktop
(который не существует здесь).
И само собой разумеется, это все происходит удаленно (это было бы бесполезно в scp
если это было заменено локальными значениями). Это работает, потому что Bash не займет место ~...
если этому предшествует что-нибудь кроме пробела.