В моем скрипте есть следующие переменные:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
Я хочу, TARGET_DIR
чтобы var содержал этот путь:, /home/username/.ssh
но использовать ~
вместо /home/
. Но когда я запускаю скрипт и пытаюсь создать новый .ssh
каталог под именем пользователя, он мне сообщает:
mkdir: cannot create directory ‘~username/.ssh’: No such file or directory
Хотя каталоги /home/username существуют. Если есть: TARGET_DIR="/home/${TARGET}/.ssh"
работает. Как использовать ~
знак в переменной?
решение1
В bash
, ash
, mksh
и yash
раскрытие тильды происходит до раскрытия параметра, поэтому это не может работать.
Вместо этого вы можете использовать ksh93
или или прибегнуть к :zsh
eval
user=username # making sure it's a valid username
eval "user_home=~$user"
target_dir=$user_home/.ssh
Если в вашей системе есть getent
команда (довольно распространенная в наши дни), вы также можете использовать:
user_home=$(getent -- passwd "$user" | cut -d: -f6)
Или используйте perl
:
user_home=$(perl -le 'for (@ARGV) {
@u = getpwnam$_ or die "No such user: $_\n";
print $u[7]}' -- "$user")
Это также будет работать с пользователями, в имени которых присутствуют нераспространенные символы (например, пробел, с которым у zsh, ~$user
но не ksh93
', ~"$user"
также возникнут проблемы).