CD~가능하지만 왜 cd ~"$USER" 또는 cd ~${USER}를 할 수 없습니까?

CD~가능하지만 왜 cd ~"$USER" 또는 cd ~${USER}를 할 수 없습니까?

사용자의 홈 디렉터리로 전환할 수 없는 이유가 궁금합니다.

$ cd ~"$USER"

또는

$ cd ~${USER}

답변1

이는 셸과 해당 셸 내에서 확장이 수행되는 순서에 따라 크게 달라집니다.

~$user$usercsh(이 기능의 소스 ), AT&T ksh, zsh, fish에 이름이 저장된 ~user사용자의 홈 디렉터리 로 확장됩니다 .

하지만 다음 변경 사항에 유의하세요.

$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx  # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx

$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x  # same in fish

$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon  # same in ksh/fish

$ u="/daemon"  csh -c 'echo ~$u'
/home/stephane/daemon  # same in zsh
$ u="/daemon"  fish -c 'echo ~$u'
~/daemon  # same in ksh

$user문자 그대로 이름이 지정된 사용자의 홈 디렉토리로 확장됩니다 bash(사용자가 존재한다고 가정하면 물론 그럴 가능성은 낮습니다).

그리고 pdksh, dash, 중 어느 것도 가 아닙니다 yash. 아마도 $user유효한 사용자 이름으로 간주되지 않기 때문일 것입니다.

답변2

물결표 확장은 명령줄 처리에서 별도의 단계입니다. 그냥 일어나는 일이야앞으로가변 확장.

물결표 뒤에 슬래시가 아닌 다른 문자가 오면 이름이 물결표 뒤에 오는 사용자의 홈 디렉토리로 확장됩니다(예: ) ~otheruser. $USER현재는 확장되지 않았고 유효한 사용자 이름과 일치할 가능성이 낮으므로 물결표는 확장되지 않습니다 .

$USER아마도 현재 사용자의 사용자 이름일 것이므로 표현식이 로 대체될 수 있습니다 ~.

답변3

~다른 답변에서 지적했듯이 동작은 쉘이 확장 을 수행하는 순서 $와 동일한 단어에 대해 두 작업을 모두 수행하는지 여부에 따라 달라집니다.

원하는 동작은 bash명령을 아주 조금만 변경하면 달성할 수 있습니다. 명령 앞에 eval.

eval "cd ~$USER"

변수에 username 으로 지정된 사용자의 홈 디렉토리로 변경됩니다 USER. 단, 쉘 특수 문자( 위험할 수 있으므로 $USER가능하면 인수로 전달하면 안 됨 ) 또는 문자가 포함되어 있지 않으며 사용자는 시스템 데이터베이스에 이 사용자에 대한 항목이 있습니다.eval/

답변4

OP가 답변을 주장했기 때문에 여기에 있습니다.

이러한 명령(및 기타 여러 명령)의 동작은 사용 중인 특정 셸에 따라 다릅니다. 어떤 특정 쉘을 사용할지 지정하지 않으면 간단한 대답이 나오지 않을 수 있습니다.

사실, 나처럼 tcsh를 사용한다면 OP의 질문에 있는 두 표현(내가 이 글을 썼듯이 - 나는 향후 편집에 대해 책임을 지지 않습니다!)이 잘 작동합니다. 다른 쉘은 사용하지 않기 때문에 어떤 기능을 하는지 모르겠습니다. 따라서 OP는 자신이 생각하는 것만큼 수행할 수 있는 작업을 이해하지 못할 수도 있습니다. :-)

관련 정보