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
содержит допустимое имя пользователя).
Способ расширения тильды заключается в том, что префикс тильды состоит из ~
плюс все символы до первой некавыченной косой черты или до конца слова, если нет некавыченной косой черты. Затем происходит замена, которая зависит от префикса тильды; ~
, ~-
и ~+
- особые случаи, в противном случае ~
удаляется, а остальные символы считаются именем пользователя. См. man bash
(или страницу руководства вашей оболочки, если эта оболочка не Bash).
В ~"/mydata"
за тильдой следует косая черта, поэтому префикс тильды - ~/mydata
; поскольку не существует учетной записи пользователя с именем /mydata
, префикс тильды не будет заменен, и оболочка будет искать каталог с буквальным именем ~/mydata
и не найдет его.
В ~/"mydata"
за тильдой следует косая черта без кавычек, и поэтому тильда заменяется содержимым $HOME
, если установлено HOME
, иначе - именем домашнего каталога пользователя (взятым из /etc/passwd
); оболочка будет искать имя каталога типа /home/
имя пользователя/mydata
.