「bash:コマンド:コマンドが見つかりません」がfalseを返しますか?

「bash:コマンド:コマンドが見つかりません」がfalseを返しますか?

ソフトウェアを自動的に構成するスクリプトを作成しています。まず、スクリプトがソフトウェアを最初にインストールする必要があるかどうかを確認してから構成したいと思います。確認して$ 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 でテスト

関連情報