~가 포함된 경로를 변수에 저장하는 방법은 무엇입니까?

~가 포함된 경로를 변수에 저장하는 방법은 무엇입니까?

내 스크립트에는 다음 변수가 있습니다.

TARGET=username
TARGET_DIR="~${TARGET}/.ssh"

TARGET_DIRvar가 이 경로를 유지 /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은 매개변수 확장 전에 발생하므로 작동하지 않습니다.mkshyash

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's ~"$user"는 문제가 없는 공간).

관련 정보