空の出力と正常な終了ステータスの両方を確認してください。

空の出力と正常な終了ステータスの両方を確認してください。

インストーラスクリプト1に次のテストを書きたいと思います。

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    install_dual_boot
else
    install_linux_only
fi

30_os-proberただし、何らかの方法で完了できなかったため、出力が生成されない可能性があります。ゼロ以外のシャットダウン状態で失敗した場合、30_os-proberデュアルブート状況を想定する方が安全です。

30_os-prober出力が生成されていないことをどのように確認できますか?正常に

基本的に次のような効果を得たいと思います。

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    # Do stuff for a dual-boot machine
    install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
    # OS probe failed; assume dual boot out of abundance of caution
    install_dual_boot
else
    install_linux_only
fi

...しかし、同じコマンドを2回実行する必要はありません。


1背景情報:30_os-proberInc。GRUB2、私が作成しているスクリプトは私のカスタム設定の一部です。固定資産投資

答え1

まず、機能的には同じですが、以下$(…)より小さいと広く考えられています。`…`これこれこれ。第二に、$?コマンドが成功したか失敗したかを確認する必要はありません。最近私の関心が集中した場所はセクション 2.9.1,簡単なコマンド ~のグループシェルとユーティリティの基本コードを開く(問題7):

「単純なコマンド」は、任意の順序で任意の変数割り当ておよびリダイレクトのシーケンスであり、任意にワードおよびリダイレクトが続き、制御演算子によって終了される。

与えられた単純なコマンドを実行する必要があるとき...
                          ⋮                                                                                (wwwwwww…)

コマンド名がある場合は、次の説明に従って実行を続行する必要があります。命令の検索と実行。コマンド名はありませんが、コマンドにコマンド置換が含まれている場合、コマンドは最後に実行されたコマンド置換の終了状態で完了する必要があります。 …

例えば、

  • コマンドの終了ステータス

    ls -ld "module_$(uname).c"
    

    終了状態lsですが

  • コマンドの終了ステータス

    myfile="module_$(uname).c"
    

    終了状態ですuname

だからフェラーダの答えこれは少し単純化することができます。

if 出力=$(/etc/grub.d/30_os-prober) && [ -z "$output" ]
    #つまり、30_os - 検出器 正常に出力を生成しません
それから
    Linuxのみをインストールしてください
その他
    デュアルブートインストール
フィリピン諸島

環境変数(またはスクリプト全体に表示される変数)にのみ名前を大文字にすることをお勧めします。制限された範囲の変数は通常、小文字(または必要に応じてcamelCase)で名前が付けられます。

答え2

変数に値を割り当ててから、終了ステータスも確認できます。

PROBE_VALUE=`/etc/grub.d/30_os-prober`

if [ "$?" -eq 0 ] && [ -z "$PROBE_VALUE" ]; then
    install_linux_only
else
    install_dual_boot
fi

関連情報