cd〜<user>は可能ですが、cd〜“ $ USER”またはcd〜$ {USER}を実行できないのはなぜですか


8

どちらかでユーザーのホームディレクターに切り替えられないのはなぜですか?

$ cd ~"$USER"

または

$ cd ~${USER}

4
「cd」と入力するだけの方がずっと簡単だからです。
jamesqf

7
@jamesqf、私たちは皆、何ができるか知っています..ここでの質問は、何ができないのか、そしてなぜですか?
Neo_Returns

回答:


20

それはシェルと、それらのシェルで展開が行われる順序に大きく依存します。

~$user名前が$usercsh(その~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されます(そのユーザーが存在する場合は、もちろん非常にまれです)。

そして、どちらの中にpdkshdashyash、彼らは考えていないと思われるので、$user有効なユーザ名です。


さまざまなシェルでの拡張について、どこで詳細を学べますか?
Neo_Returns

6
@Neo_Returns、それぞれの取扱説明書、及びその者が明らかに...試行錯誤し、それが利用可能だ人のためのソースコードで、文書化されていない
ステファンChazelasに

10

ティルダ展開は、コマンドラインの処理における個別のステップです。変数展開の直前発生します。

チルダの後にスラッシュ以外が続く場合、たとえば、のように、チルダの後に名前が続くユーザーのホームディレクトリに展開され~otheruserます。以来$USER、その時点で展開されていませんし、それが有効なユーザー名に対応してそうだから、チルダが拡張されていない残っています。

$USERは現在のユーザーのユーザー名である可能性が高いため、式はおそらく単にに置き換えることができます~


6

他の回答が指摘しているように、動作はシェルが実行する順序~$展開、および同じ単語に対して両方を実行するかどうかによって異なります。

あなたが探していた振る舞いはbash、コマンドをほんの少し変更するだけで実現できます。コマンドの前に単にを付けevalます。

eval "cd ~$USER"

変数のユーザー名で指定されたユーザーのホームディレクトリに変更されますUSER。ただし$USER、シェルに特別な文字が含まれていない場合(リモートの可能性がある場合は、引数として渡さないでください。eval危険です。 )または/文字、およびシステムのユーザーデータベースにそのユーザーのエントリがあること。


3

変数展開の前にチルダ展開が発生するシェルの1つを使用している場合、変数ユーザーのホームディレクトリを検索する別の方法は、getentを使用することです。このツールは、少なくともLinux、Solaris、およびFreeBSDに存在します。それがどれほど普遍的かはわかりません。

$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs

チルダ展開と同様に、これには、それを実行su - $USER -c 'echo $HOME'する特権がある場合に印刷されるのと同じ結果が得られない場合があります。


1
perl -le 'print((getpwnam shift)[7])' -- "$USER"移植性が少し高くなる可能性もある。
ステファンChazelas

-2

OPは答えを主張するので、ここにあります。

これらのコマンド(および他の多くのもの)の動作は、たまたま使用している特定のシェルによって異なります。使用する特定のシェルを指定しない限り、簡単な答えを出すことはおそらく不可能です。

実際、私がそうであるように、tcshを使用する場合、OPの質問の両方の式(これは私がこれを書いているときに書かれているため、将来の編集には責任を負いません)は完全にうまく機能します。他のシェルを使用しないので、他のシェルが何をするかわかりません。したがって、おそらくOPは、何ができるかについて、彼/彼女が考えるほど多くを知りません:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.