왜 ~
그것을 확장하지 않습니까 $ ./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
합니다 . 또한 , 및 에서도 확장될 예정입니다 .bash
dash
mksh
yash
ksh93
$a
zsh
$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