Bashで失敗したコマンドを確認するには?

Bashで失敗したコマンドを確認するには?

bashスクリプトを使用してkubernetesがインストールされていることを確認する必要があります。そうでない場合は、セットアッププロセスを開始します。kubectl cluster-info出力があるかどうかを確認してみるとよいでしょう。失敗したコマンドを確認するには?

if command kubectl cluster-info > /dev/null; then
    # sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
    # ...
fi

答え1

互換性のあるシェルにsh存在しないコマンドの終了状態は、必ずしも必要です127

コマンドが見つからない場合、終了ステータスはです127。コマンド名が見つかりましたが実行可能ユーティリティではない場合は、シャットダウン状態にする必要があります126

源泉)

内蔵内容は大幅に変更されていませんcommand

[...] は、次の終了値を返す必要があります。

126
指定されたユーティリティ[...]が見つかりましたが、呼び出すことはできません。

127
コマンドユーティリティでエラーが発生したか、指定された[...]ユーティリティが見つかりません。

源泉)

あなたの例が修正されました:

command kubectl cluster-info >/dev/null 2>&1
if [ "$?" -eq 127 ]; then …

しかもtype

ユーティリティーは、typeコマンド名として使用される場合、各パラメーターがどのように解釈されるかを表示する必要があります。

源泉)

POSIX は出力の正確な形式を指定しません。終了ステータスは、エラーと成功を区別するだけです。提供されたコマンドが存在しないことが正常に検出されたかどうかは不明です。

しかし、大きな打撃を受けた状態で疑いの余地はありません:

すべての名前が見つかった場合は戻り状態は 0 で、名前が見つからない場合は 0 ではありません。

いくつかの便利なオプションがあります。

-tこのオプションを使用すると、または(名前がエイリアスの場合はシェル関数、シェル組み込み関数、ディスクファイル、またはシェル予約語のそれぞれ)のいずれかであるtype単語を印刷します。名前が見つからない場合は、何も印刷されず、失敗ステータスが返されます。aliasfunctionbuiltinfilekeywordtype

このオプションを使用すると、-ptypeは実行するディスクファイルの名前を返し、-tそうでない場合は何も返しませんfile

type -t kubectlおよび/またはの出力および終了ステータスを調べてtype -p kubectl何かを学ぶことができます。kubectl いいえ呼んでください。

kubectlそれにもかかわらず、命令として使用されたときに実行されるファイルとして解釈されることを事前に発見しても、それが実行されることを意味するものではありません。これ kubectlあなたはする必要があります。

答え2

既存の回答は私が必要とするものと似ていますが、既存の回答をすべて組み合わせた後は、次のことが機能します。

if type kubectl &> /dev/null; then
  source <(kubectl completion bash)
fi

アンパサンドがない場合、出力は端末に表示されます。

関連情報