どちらかでユーザーのホームディレクターに切り替えられないのはなぜですか?
$ cd ~"$USER"
または
$ cd ~${USER}
どちらかでユーザーのホームディレクターに切り替えられないのはなぜですか?
$ cd ~"$USER"
または
$ cd ~${USER}
回答:
それはシェルと、それらのシェルで展開が行われる順序に大きく依存します。
~$user
名前が$user
csh(その~user
機能の由来)、AT&T ksh、zsh、fishに格納されているユーザーのホームディレクトリに展開されます。
ただし、これらのバリエーションに注意してください。
$ 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
有効なユーザ名です。
他の回答が指摘しているように、動作はシェルが実行する順序~
と$
展開、および同じ単語に対して両方を実行するかどうかによって異なります。
あなたが探していた振る舞いはbash
、コマンドをほんの少し変更するだけで実現できます。コマンドの前に単にを付けeval
ます。
eval "cd ~$USER"
変数のユーザー名で指定されたユーザーのホームディレクトリに変更されますUSER
。ただし$USER
、シェルに特別な文字が含まれていない場合(リモートの可能性がある場合は、引数として渡さないでください。eval
危険です。 )または/
文字、およびシステムのユーザーデータベースにそのユーザーのエントリがあること。
変数展開の前にチルダ展開が発生するシェルの1つを使用している場合、変数ユーザーのホームディレクトリを検索する別の方法は、getentを使用することです。このツールは、少なくともLinux、Solaris、およびFreeBSDに存在します。それがどれほど普遍的かはわかりません。
$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs
チルダ展開と同様に、これには、それを実行su - $USER -c 'echo $HOME'
する特権がある場合に印刷されるのと同じ結果が得られない場合があります。
perl -le 'print((getpwnam shift)[7])' -- "$USER"
移植性が少し高くなる可能性もある。