Как делает использование работы тильды как ярлык на мой корневой каталог?

Я был смущен, пытаясь скопировать некоторые файлы от одного ПК до другого. Мне выяснили его, но синтаксис все еще сбивает с толку меня. Это работает:

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? или есть ли что-то о тильде, которую я пропускаю?

30
задан 14 March 2016 в 17:47

4 ответа

~ Ваш корневой каталог.

~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 
  ~+   ~-
68
ответ дан 23 November 2019 в 00:45

Символ ~ используется в качестве ярлыка для /home/user в bash, таким образом, в случае ~/Desktop/Volenteer.png это - сокращение от /home/user/Desktop/Volenteer.png.

Поэтому, как Вы видите эти /, как всегда, показывает новый уровень в иерархии файловой системы.

4
ответ дан 23 November 2019 в 00:45

~ сокращение от переменной среды $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

Это перечислит каждого локального пользователя и их корневой каталог.

3
ответ дан 23 November 2019 в 00:45

Имейте чтение через документации 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 не займет место ~... если этому предшествует что-нибудь кроме пробела.

21
ответ дан 23 November 2019 в 00:45

Другие вопросы по тегам:

Похожие вопросы: