ソフトウェアを自動的に構成するスクリプトを作成しています。まず、スクリプトがソフトウェアを最初にインストールする必要があるかどうかを確認してから構成したいと思います。確認して$ software --version
得たらbash: command: command not found
まずインストールすることになります。
偽を返しますかbash: command: command not found
?
編集:答えがあれば答えを説明できますか?
答え1
はい。
$ spamegg
spamegg: command not found
$ echo $?
127
次のことができます。
if software --version &>/dev/null; then
## True, do something
else
## False, do something
fi
答え2
特定のコマンドが使用可能であることを確認することが目的の場合は、コマンドを実行するのではなく、次のことを行う必要があります。
if command -v spamegg >/dev/null; then
echo spamegg is available
else
apt-get install spamegg
fi
動作していることを確認するために実行しようとするのはspamegg
悪いアプローチです。まず、コードを難読化して、spamegg
何かをインストールするために使用されたように見えます。 2番目に(もっと重要なのは)確認中のコマンドが存在しますが、何らかの理由で失敗する可能性があります。
if grep >/dev/null 2>&1; then
echo grep is available
else
echo grep is not available
fi
grep is not available
これも出力されます。
答え3
IMHO、あなたのアプローチがこの問題を解決する最善の方法だとは思わない。その理由は、単にコマンドが返されるからです。見つかりません、プログラムがそうでないという意味ではありません。インストール済み。これは、プログラムがPATHの場所にないことを意味する可能性があります。
おそらくより良いアプローチは、実際にインストールされたパッケージのリストをチェックすることです。
RHEL/セントOS:
grep PROGRAM_NAME <(rpm -qa --qf "%{NAME}\n")
Debian/Ubuntu:
grep PROGRAM_NAME <(dpkg --get-selections | awk '{ print $1}')
答え4
# example you need wget and your PATH is okay then:
# bash/ksh/.. will return exit code 127 if command not found
#
# redirect stdin and stderr to the /dev/null = if exist,
# output is not interesting
wget --help >/dev/null 2>&1
stat=$? # variable ? include last command exit status
echo "exit status:$stat"
if ((stat == 127 )) ; then # not exist/found
echo "install wget"
exit 1
fi
echo "wget exist, continue"
if beforeコマンドを使用することもできますが、このコマンドはゼロ以外のすべての終了コードを処理します。
ifを使用してすべてのコマンドを実行し、終了コードをテストできます。
# ifコマンド; #うまくいきます。 #その他 #あまり良くない #飞
# negative testing ! = if not exit code 0 then
if ! wget --help >/dev/null 2>&1 ; then
# give err msg to the stderr and exit
echo "install wget / wget didn't work correctly" >&2
exit 1
fi
echo "wget works fine"
ifでテストする前に、まずタスク終了コードを見てください。
wget --help エコ$? #0=OKを表示します。 0ではない、いいえ # コマンドの戻り値が 0 以外の場合、テストに if を使用できません。 # 終了値 = 127 でテスト