私はLinuxMint(CentOSも試しています)を使用しており、printenvコマンドを使用して存在または存在しない可能性がある環境変数を設定しようとしました。したがって、存在する場合はその名前の値を印刷し、それ以外の場合は終了コード0を返す以外は何も印刷したくありません。
ただし、存在しない環境名で呼び出すと、エラーコード1で終了します。この動作はprintenvのマニュアルページやヘルプに文書化されていません。
私が試したことは次のとおりです。
> /usr/bin/printenv foo
返されたら、次の操作を行います。
> echo $?
返品:
1
printenvのバージョンは次のとおりです。
printenv (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie and Richard Mlynarik.
私が望むことを達成する他の方法がある人はいますか?最終的に環境変数がある場合は、その値を含むようにbash変数を設定し、そうでない場合はbash変数を削除します。
mybashv=`printenv foo`
答え1
printenvの情報文書には、終了コードについて次のように記載されています。
0 if all variables specified were found
1 if at least one specified variable was not found
2 if a write error occurred
これは観察されたものと一致しているようです。
私が理解したことが正しいなら、このステータスコードを隠したいと思います。すべてのコマンドにを追加するだけです|| true
。たとえば、次のようになります。
$ var=`printenv foo || true`
$ echo $?
0
答え2
環境変数の内容を印刷できないときにゼロ以外の終了状態(失敗)を返すことは、私にとって正しいことのように聞こえます。これは、tcsh
同じ名前の組み込み関数の動作とBSDの歴史的実装と一致します。
そうしないと、null値に設定されている変数と未設定の変数を区別することは困難です。
set -e
/の効果を避けるには、set -o errexit
次のようにします。
var=$(printenv VAR) || : Do not care if it fails
または:
if var=$(printenv VAR); then
if [ -z "$var" ]; then
echo "VAR is set but empty or consists only of newline characters"
else
echo "VAR is set and non-empty"
fi
else
echo "VAR is not in the environment"
fi
さらに、すべてのシェルはその環境変数からシェル変数を初期化するため(シェル変数にマップできる変数の場合、一部のシェルはマップできない変数を削除します)、これを使用してスクリプトから$VAR
それを参照することもできます。 Bourne、csh、またはtcshシェル(`...`
人々がまだシェルを使用したい場合がある唯一のシェル)からシェル変数をエクスポートせずに(またはsetenv
for(t)csh)に代入せずに変更する場合は、一緒に使用してください。