回答:
その情報が/etc/passwd
LDAP などのローカルファイルに保存されているかどうかに関係なく、ユーザー情報を検索するユーティリティがあります。という名前getent
です。
ユーザー情報を取得するには、を実行しgetent passwd $USER
ます。次のような行が返されます。
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
これで、たとえば次のようにcutを使用して、ホームディレクトリを簡単に切り取ることができます。
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
変数では使用できませんbash
。とにかく、直接ではありません。
~
けれども、タブ拡張に思えない、との別のspec'd行動チルダプレフィックスは、使用して得られたログイン名に関連付けられた最初の作業ディレクトリのパス名に置き換えられるものとするgetpwnam()
機能をので、おそらく、ルックアップはかなり良好であることをと。ただし、タブ拡張は好きではありません。タブを入力するのが好きです。
を使用eval
して、誰かのホームディレクトリを取得できます。
eval echo "~$USER"
少なくともローカルユーザーの場合、これは確実に機能します。LDAPなどのリモートユーザーがで処理されるかどうかはわかりませんeval
。
eval
が必要です。Bashは~foo
変数の展開後に処理しません。
USER
。
$USER
に展開するだけで、アルファベット文字の単一の文字列。
通常の場所はですが/home/$USER
、それは普遍的である必要はありません。そのような情報を検索する決定的な場所は、ファイル内です/etc/passwd
。
このファイルは誰でも読むことができるため(誰でも読むことができます)、すべてのユーザーがそのコンテンツにアクセスできます。
ファイルに$ USERが存在する場合、lastの前のエントリはユーザーのホームディレクトリです。
これにより、エントリが選択され、HOMEディレクトリが印刷されます。
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
より複雑な(リモート)システムの場合、getentは、NSS(ネームサービススイッチライブラリ)システムからユーザー情報を取得する通常のコマンドです。
のコマンド
echo $(getent passwd $USER )| cut -d : -f 6
同等の情報を提供します(利用可能な場合)。
ユーザーが存在しない場合、getent
エラーを返します。
の終了コードを無視しない小さなシェル関数を次に示しますgetent
。
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
以下に使用例を示します。
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
ルートとしてログインしているUSER
場合、パスワードがわかってUSER
いる場合、またはパスワードがない場合は、次のオプションを使用できます。
su -c 'echo ~' ${USER}
標準のsu
動作では、USER
が未定義または空の場合su
、rootとしてコマンドを実行しようとします。
の値がUSER
有効なユーザー名でない場合、適切なエラーが発生します:su: user <user> does not exist
。
ここにはすでにたくさんの良い答えがありますが、これはまだ誰かを助けるかもしれません。