Разверните переменную перед тильдой - PullRequest
0 голосов
/ 30 ноября 2018

Я уверен, что об этом уже спрашивали, но я ничего не могу найти.У нас есть непостижимые имена входа на общем компьютере, и мы хотим использовать переменные оболочки для замены трудно запоминаемых имен входа настоящими именами людей.

Например, допустим, имя пользователя Омара - xyz123.Я могу сделать это:

$ omar=xyz123
$ echo ~$omar

и вывод выглядит нормально:

~xyz123

, но если я наберу это:

$ ls ~$omar

, возникнет ошибка:

ls: cannot access ~xyz123: No such file or directory

Я думаю, это потому, что расширение тильды происходит до расширения переменной, но я не могу понять, как обойти это.

Возможно, этот ответ связан, хотя я не уверен: Как вручную развернуть специальную переменную (например, ~ тильда) в bash

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я хотел бы проверить, является ли "$omar" действительным пользователем с id, а затем использовать eval для принудительного двойного расширения.Так что защити от зла ​​eval, а затем сделай это.

if ! id "$omar" >/dev/null 2>&1; 
   echo "Error: user with the name $omar does not exist!" >&2
   exit 1
fi
eval echo "\"~$omar\""
0 голосов
/ 01 декабря 2018

bash расширяет тильду до переменной.См. https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

. Оболочка увидит, являются ли буквенные символы $ o m a r логином.Поскольку они не, тильда не расширена.Оболочка в конечном итоге видит $omar как переменную и заменяет ее.Затем он передает расширенное слово ~xyz123 на echo, которое просто печатает его.

Аналогично, оно передает слово ~xyz123 на ls.Поскольку ls не выполняет собственного расширения тильды, он ищет файл в вашем текущем каталоге с именем ~xyz123 с буквальной тильдой.Так как такого файла не существует, вы получите эту ошибку.

Если вы хотите, чтобы ls ~$var перечислял файлы, вам нужно eval ls ~$var.Или, поскольку eval считается небезопасным для использования случайно, вы можете сделать это вместо этого:

ls "$(getent passwd "$omar" | cut -d: -f6)"
...