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

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

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

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및 물결표 확장 은 매개변수 확장 전에 발생 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"

관련 정보