5

someuser のホーム ディレクトリが /home/someuser であるとします。

NAME=あるユーザー

bash では、チルダ (~) と $NAME を組み合わせてユーザーのホーム ディレクトリを返すには、どのような式を使用しますか?

HOMEDIRECTORY=~someuser
echo $HOMEDIRECTORY
/home/someuser
NAME=someuser
echo ~$NAME
~someuser

助言がありますか?

4

6 に答える 6

16

より安全:

eval HOMEDIRECTORY="$(printf "~%q" "$NAME")"

ここでは、危険な文字%qを引用してエスケープするオプションがあります。printf

$NAMEjoe の場合、 のようなものが得られます/home/joe。root の場合、/root. 「abc;rm something」の場合、何かが削除される代わりに「~abc;rm something」が得られます。

于 2010-01-15T06:23:15.567 に答える
6

アクセスできる場合getent

getent passwd "$NAME" | cut -d: -f 6
于 2010-01-15T04:33:56.550 に答える
1

bashとcshの興味深い違いは、〜$VARNAMEが実際に期待どおりの動作をすることです。

これは醜いですが、bashで機能するようです:

homedir=`eval "echo ~$USERNAME"`

これで、$homedirは$USERNAMEに関連付けられたホームディレクトリを保持します。

于 2010-01-15T04:30:11.490 に答える
1

チルダ(〜)は$ HOMEと同じなので、すべてのユーザーが同じディレクトリをホームにするためのルートを持っているわけではありません。

ただし、チルダの使用を主張する場合は、次の作業を行ってください。

echo ~/../$NAME

見る:

$ pwd
/home/oreyes
$ export NAME=john 
$ export DIRECTORYNAME=~/../$NAME
$ cd $DIRECTORYNAME
$ pwd
/home/john
于 2010-01-15T04:29:38.680 に答える
0

1 つの代替方法

awk -F":" '{print "user: "$1", Home directory is: "$6}' /etc/passwd
于 2010-01-15T04:16:44.493 に答える