su を使用して、ユーザーの環境変数が存在することを確認します。

su を使用して、ユーザーの環境変数が存在することを確認します。

私はこの問題を数日間処理してきました。 $1 ユーザーに対して環境変数 $2 が存在することを確認する必要があります。

私はいくつかのケースを試しました。

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(だからいいえ(Bash> 4.2を試しました))

if [ su - ${1} -c "[ -z "${2}" ]" ]

今問題が見えないので、このアプローチを試しています:/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

答え1

最初の例の構文が正しくありません。あなたが書いている場合:

[[ -v $HOME ]]

その後、実際に次のコマンドを実行します。

[[ -v /home/yourusername ]]

もちろんこれは失敗するでしょう。あなたが望むもの:

[[ -v HOME ]] && echo ok || echo no

これを次のように組み合わせることができますsu

su - root -c "[[ -v HOME ]]" && echo ok || echo no

引用符を入れ子にできず、コマンドが実行される前にシェル変数拡張が発生するため、最後の例は機能しません。つまり、次のように与えられます。

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

実際に実行するコマンドは次のとおりです。

su - root -c 'echo /home/somesuser | ...'

$HOME観点から値を取得するには、root一重引用符などを使用してローカルシェルで変数の拡張を防ぐ必要があります。

su - root -c 'echo $HOME | ...'

wc単語数が$HOMEほとんど常にあるため、出力をに渡す理由は不明です1。または、以下をwc使用して出力を後処理することなく、そのオプションを使用して単語数を取得できます。sedcut-w

su - root -c 'echo $HOME | wc -w'

関連情報