경로 변수에 "~"와 같은 공백과 기호를 모두 포함하려면 bash에서 스크립트를 어떻게 작성합니까?

경로 변수에 "~"와 같은 공백과 기호를 모두 포함하려면 bash에서 스크립트를 어떻게 작성합니까?

~그것을 확장하지 않습니까 $ ./foo.sh?

MYPATH_TO=~"/Documents 2/temp"
echo ~
echo "$MYPATH_TO"
mkdir "$MYPATH_TO"

실행 시 /home/mint/Documents 2생성됩니다 /home/mint/Documents 2/~/Documents 2/temp(에코 출력 /home/mint ~/Documents 2/temp). 내가 읽고큰따옴표 안에서 물결표(~)가 확장되지 않는 이유는 무엇입니까?~그리고 따옴표 바깥쪽에 넣어도 여전히 확장되지 않습니다. 이유는 무엇입니까?

추가됨: 인용되어 있기 때문에 확장되지 않지만 mkdir경로에 공백과 기호가 모두 있을 것으로 예상되는 경우 어떻게 스크립트를 작성할 수 있습니까?~

mkdir추가 2: 공백 없이 인용되지 않은 경로를 시도할 때 :

MYPATH_TO=~"/Documents/temp"
mkdir $MYPATH_TO

오류가 발생합니다 mkdir: cannot create directory ‘~/Documents/temp’: No such file or directory. 왜? Documents집에 있어요 . 나는 길을 잃었다...

시스템: 리눅스 민트 19.2

답변1

빠른 수정은 인용된 부분 외부에 첫 번째 슬래시를 넣는 것입니다.

MYPATH_TO=~/"Documents 2/temp"
echo "$MYPATH_TO"

/home/user/Documents 2/temp

다른 예시:

bash -c 'a=~"/." b=~\/. c=~/. d=~/"."; echo "$a $b $c $d"'
~/. ~/. /home/user/. /home/user/.

$c및 만 , 및 에서 물결표를 확장 $d합니다 . 또한 , 및 에서도 확장될 예정입니다 .bashdashmkshyashksh93$azsh$a$b

POSIX에 따르면기준(강조):

"물결표 접두사"는 <tilde>단어 시작 부분의 따옴표가 없는 문자와 그 단어 앞의 모든 문자로 구성됩니다.처음으로 인용되지 않은<slash>이 말에. 할당에서 여러 개의 물결표 접두사를 사용할 수 있습니다. 단어 시작 부분(예: 할당의 등호 뒤), 따옴표가 없는 콜론 뒤 또는 둘 다. 할당의 물결표 접두사는 다음과 같은 방식으로 종료됩니다.따옴표가 없는 첫 번째 콜론 또는 슬래시.

IMHO, 이것은 문자를 따르지 않음에도 불구하고 ksh93사용자 이름에 슬래시를 포함하도록 허용하는 의도인 것처럼 보이는 것을 달성하기 때문에 무의미한 짜증일 뿐입니다( 에서 백틱을 사용하여 이스케이프할 수 있습니다 ksh93).

cat <<'EOT' >getpwnam.c
#include <pwd.h>
static struct passwd pwd = { "", "", 666, 666, "", "/hell", "" };
struct passwd *getpwnam(const char *name){ return &pwd; }
EOT
cc -Wall -shared getpwnam.c -o getpwnam.so
for sh in dash bash yash mksh zsh ksh93; do
    printf '%s\t' "$sh"
    LD_PRELOAD=./getpwnam.so HOME=nowhere \
      "$sh" -c 'echo ~q ~\/q ~"/q"'
done

dash    /hell ~/q ~/q
bash    /hell ~/q ~/q
yash    /hell ~/q ~/q
mksh    /hell ~/q ~/q
zsh     /hell nowhere/q nowhere/q
ksh93   /hell /hell nowhere/q

관련 정보