Как сохранить путь с ~ в переменную?

Как сохранить путь с ~ в переменную?

В моем скрипте есть следующие переменные:

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или или прибегнуть к :zsheval

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"также возникнут проблемы).

Связанный контент