내 스크립트에는 다음 변수가 있습니다.
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
's ~"$user"
는 문제가 없는 공간).