사용자의 홈 디렉터리로 전환할 수 없는 이유가 궁금합니다.
$ cd ~"$USER"
또는
$ cd ~${USER}
답변1
이는 셸과 해당 셸 내에서 확장이 수행되는 순서에 따라 크게 달라집니다.
~$user
$user
csh(이 기능의 소스 ), 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는 자신이 생각하는 것만큼 수행할 수 있는 작업을 이해하지 못할 수도 있습니다. :-)