대시로 시작하는 CLI 인수와 함께 사용할 때 물결표 (~)가 확장되지 않는 이유는 무엇입니까? 않았다는 것을 깨달을 때까지 많은 시간을

VNC 서버 (x0vncserver)를 실행하는 데 몇 시간이 걸리고 클라이언트가 이상한 메시지로 연결을 거부했습니다.

No password configured for VNC Auth

서버는 또한이 오류를 인쇄

 SVncAuth:    opening password file '~/.vnc/passwd' failed

좋아, 나는 물결표가 껍질이나 x0vncserver에 의해 확장되지 않았다는 것을 깨달을 때까지 많은 시간을 낭비했다. 그런 다음이 테스트를 실행했습니다.

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd

그러나

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd

왜 그런 겁니까? 인수가 대시로 시작하면 쉘이 물결표 확장을 거부하는 이유는 무엇입니까? 나는 인용되지 않은 한 항상 물결표가 확장 될 것이라고 생각했지만 분명히 다른 규칙이 적용됩니까?



답변

이것은 bash매뉴얼에 설명 된 쉘 의 특성입니다 .

또한 Bash는 간단한 명령에 대한 인수로 표시 될 때 변수 지정 조건 (위에 설명 된 PARAMETERS)을 만족시키는 단어에 대해 물결표 확장을 수행합니다. posix 모드에있을 때 위에 나열된 선언 명령을 제외하고 Bash는이를 수행하지 않습니다.

이 수단 bash 것이다 당신의 물결을 확장 PasswordFile=~/.vnc/passwd이의 인수 이후, 문자열 echo변수 할당과 같은 그 모습이.

문자열 --PasswordFile=~/.vnc/passwd--PasswordFile유효한 변수 이름이 아니기 때문에 문자열 이 변수 할당처럼 보이지 않습니다 .

참고 bashPOSIX 모드에서 실행할 때이 작업을 수행하지 않으며, 다른 조개처럼 zsh, ksh또는 yash기본적으로이 작업을 수행하지 않는다 ( zsh있다 magicequalsubst틸드 확장을위한 옵션이 인용되지 않은 등호 후 수행 할 ( =)하지만).

현재 사용자의 홈 디렉토리 경로가 명령에 대한 인수의 일부로 올바르게 확장되도록 $HOME하려면 물결표 대신 값을 사용하십시오 .

echo --PasswordFile="$HOME/.vnc/passwd"

은 “위에 나열된 선언 명령”이 매뉴얼은 명령에 내장되어 있습니다에 언급 alias, declare, typeset, export, readonly,와 local.