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


9

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

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



답변:


13

이것은 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.


1
+1 | 나는 그것을 생각하지 않을 것입니다.
LinuxSecurityFreak

참고 사항 : bash --posix -c '"export" a=~; printf "%s\n" "$a"'출력 ~.
Stéphane Chazelas

2
참고 것을 ~확대 존재는 alias a=~POSIX의 적합성 버그를 수 (및 유용하지 않습니다) 것입니다. 그러나 이것이 ksh88이 수행 한 방식 (ksh93에서 변경됨)이며 bash, zsh 및 pdksh가이를 수행하는 이유 일 수 있습니다. yashPOSIX 사양에 대해 작성된 이유 는 그렇지 않습니다.
Stéphane Chazelas

이것이 정답이지만 올바른 접근 방식 은 옵션 인수 =를 하나의 인수로 병합하는 대신 옵션 인수를 별도의 인수로 제공하는 것 입니다. 그런 다음 물결표 확장은 단어의 시작 부분에 있으며 질문은 무례합니다.
JdeBP

1
@JdeBP, 공교롭게도의 경우 x0vncserver, x0vncserver --PasswordFile file작업이 필요하지 않습니다 --PasswordFile=file.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.