ユーザー名でホームディレクトリを取得する


84

echoを使用して任意のユーザーのホームディレクトリを取得したい

echo ~puchuu
>> /home/puchuu

しかし、変数を使用することはできません

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu

回答:


86

以下を使用できますeval

eval echo ~$USER

ただし、以下のAndrewのコメントとglennの返信を参照してください。


8
bashではevalはecho ~$username大丈夫だけで必要ではありませんが、sh evalでは変数が必要な場合に必要です
フェリペアルカシバル

これは、間違った値を与える場合があります。同じユーザー名を持つ以前のアカウントのホームフォルダーでしょうか。
アンドリュー

@AndrewMacFie:「前へ」とはどういう意味ですか?
チョロバ

1
@chorobaユーザーを追加し、ユーザーを削除してから、同じユーザー名のユーザーを追加します。ユーザーのホームフォルダーが2回目に異なる場合、このコマンドは現在のホームフォルダーではなく元のホームフォルダーを提供します。glenn jackmanの答えが現在の答えです。
アンドリュー

また、シェルが解釈する可能性のある特殊文字が含まれeval echo "~$USER"$USERいないという仮定をしている場合にも注意してください。たとえば、ifの場合USER="foo\$bar"evalシェルは$bar出力に代入しますが、これは望みのものではありません。基本的に、このルートをとる場合、それが正しい$USER入力であることを確認する必要があります。ほとんどの場合、おそらくそうなりますが、これを覚えておく必要があります。
ゾラワー

65

これはあなたのために働くかもしれません:

homedir=$( getent passwd "$USER" | cut -d: -f6 )

これは、あなた以外のユーザーでも機能します。例えば、

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )

これは正当であり、自宅の場所を仮定するよりもさらに一歩進んでいると仮定するのgetenvpasswdはなく、使用しています/home/
エヴァンキャロル

13

あなたはそのユーザーのようです-なぜ

echo $HOME


3
sudoされた環境にいて、sudoに-Hまたは-iフラグを渡さなかった場合、これは機能しません-$ HOMEは以前の(sudo'ing)ユーザーのホームディレクトリのままです。
Asfand Qazi

1

それが役立つかどうかはわかりませんが、式の外側にチルダを配置すると、ZSHでは機能しますが、Bashでは機能しません:

echo ~`echo $USER`

0

ログインしたら、実行cdしてホームディレクトリに移動し、次に実行pwdして作業ディレクトリを印刷します。


それはうまくいきません。ここでの考えは、シェルスクリプトでこれを行うことであり、おそらく問題のユーザーの資格情報を必要とせずに
...-SamB

SamBが言及したのと同じ理由で-1。Markdown書式の使用方法を確認し、より簡潔にするため、回答を編集しました。また、はるかに簡単な方法も見逃しましたecho $HOME
-wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.