Bashのテストオプションが正しく機能しません。

Bashのテストオプションが正しく機能しません。

次のコマンドを使用してnoclobberオプションをテストしようとしましたが、if [ -o noclobber ]何もしませんでした。

以下を使用するようにnoclobberオプションを設定しましたset +o noclobber

prompt> cat checkoption.sh
#!/bin/bash
if [ -o noclobber ]
     then
          echo "Option is on."
fi
prompt>
prompt> set +o noclobber
prompt> set -o | grep noglobber
noclobber       on
prompt> ./checkoption.sh
prompt>

なぜここでメッセージを受信できないのか知っていますか?

ベストアンサー1

シェルオプションはシェルセッション間で継承されず、ここでは2つのシェルセッションを処理します。

  1. シェルオプションを設定する対話型セッション
  2. オプションをテストするシェルスクリプトセッション。

シェルスクリプトは、呼び出す対話型シェルセッションでこのオプションが設定されていることを検出しません。

解決策:

  1. コードをシェル関数(たとえば$HOME/.bashrc)に変換します。

    checknoclobber () { [ -o noclobber ] && echo 'Noclobber is on'; }
    

    または一般的なケースでは

    checkoption () {
        if [ -o "$1" ]; then
            printf '%s is set\n' "$1" >&2
            return 0
        else
            printf '%s is not set (or invalid option name)\n' "$1" >&2
            return 1
        fi
    }
    
  2. スクリプトでオプションを設定します。

  3. source対話型シェルからスクリプトファイルをインポートするには、またはコマンドを使用します.

おすすめ記事