Почему `cd ~« / mydata »` завершается успешно, а `cd ~ /« mydata »` нет

In:

sudo -u joe ls ~

~ расширяется вашей оболочкой перед запуском команды (здесь sudo), поэтому на самом деле выполняется:

sudo -u joe ls /home/me

Чтобы просмотреть содержимое joe домашний каталог :

ls ~joe

Или, если у вас нет доступа для чтения к его домашнему каталогу:

sudo -u joe ls ~joe

Или для оболочки, работающей как joe , чтобы расширить ~:

sudo -u joe sh -c 'ls ~'

Обратите внимание, что кроме csh/tcsh/zsh вы не можете использовать ls ~joe подход, если имя пользователя находится в переменной. В зависимости от оболочки

user=joe
echo ~$user

выводит либо /home/mejoe, либо ~joe. В bash если был пользователь с именем $user (буквально), это возвращало его домашний каталог.

Здесь вам понадобится:

eval "ls ~$user"

(вы должны заранее убедиться, что $user содержит допустимое имя пользователя).

0
20.12.2016, 22:38
1 ответ

Способ расширения тильды заключается в том, что префикс тильды состоит из ~ плюс все символы до первой некавыченной косой черты или до конца слова, если нет некавыченной косой черты. Затем происходит замена, которая зависит от префикса тильды; ~, ~- и ~+ - особые случаи, в противном случае ~ удаляется, а остальные символы считаются именем пользователя. См. man bash (или страницу руководства вашей оболочки, если эта оболочка не Bash).

  • В ~"/mydata" за тильдой следует косая черта, поэтому префикс тильды - ~/mydata; поскольку не существует учетной записи пользователя с именем /mydata, префикс тильды не будет заменен, и оболочка будет искать каталог с буквальным именем ~/mydata и не найдет его.

  • В ~/"mydata" за тильдой следует косая черта без кавычек, и поэтому тильда заменяется содержимым $HOME, если установлено HOME, иначе - именем домашнего каталога пользователя (взятым из /etc/passwd); оболочка будет искать имя каталога типа /home/имя пользователя/mydata.

5
28.01.2020, 02:16

Теги

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