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(ユーザーが存在すると仮定すると、もちろんそうではありません)。

そしてpdkshdashどちらもありませんyash。おそらく、$user有効なユーザー名とは見なされないからです。

答え2

チルダ拡張はコマンドライン処理の別のステップです。ただ起こっていることだ今後可変拡張。

チルダの後にスラッシュ以外の文字が続くと、名前はチルダの後にあるユーザーのホームディレクトリに展開されます(例:)~otheruser$USER現在は拡張されておらず、有効なユーザー名と一致する可能性が低いため、チルダは拡張されません。

$USERおそらく現在のユーザーのユーザー名であるため、式はで置き換えられます~

答え3

~他の回答で指摘したように、動作はシェルが拡張を実行する順序$と同じ単語に対して両方の操作を実行するかどうかによって異なります。

必要な動作は、bashコマンドを少し変更するだけで達成できます。コマンドの前にeval

eval "cd ~$USER"

変数にusernameで指定されたユーザーのホームディレクトリに変更されますUSER。ただし、シェル特殊文字(危険な可能性があるため、可能であれば引数として$USER渡すべきではありません)または文字は含まれておらず、ユーザーはシステムデータベースにこのユーザーのエントリを持っています。eval/

答え4

OPが答えを主張したのでここにいます。

これらのコマンド(および他の多くのコマンド)の動作は、使用している特定のシェルによって異なります。どの特定のシェルを使用するかを指定しないと、単純な答えが出ない可能性があります。

実際、私のようにtcshを使用している場合は、OPの質問にある2つの表現(私がこの記事を書いたように - 私は今後の編集について責任を負いません!)がうまくいきます。他のシェルは使用しないので、どのような機能をするのかわかりません。そのため、OPは自分が思うようにできることを理解できない可能性があります。 :-)

関連情報