回答:
その情報が/etc/passwdLDAP などのローカルファイルに保存されているかどうかに関係なく、ユーザー情報を検索するユーティリティがあります。という名前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。
ここにはすでにたくさんの良い答えがありますが、これはまだ誰かを助けるかもしれません。