私のbashにこのスクリプトの対話型フラグが含まれていないのはなぜですか?

私のbashにこのスクリプトの対話型フラグが含まれていないのはなぜですか?

仕事この回答cronスクリプトが実行中か対話型で実行されているかどうかを確認するために、このスクリプトを試しました。

#!/bin/bash

# "reliable" interactive check
case "$-" in
        *i*)
                interactive=1
                ;;
        *)
                interactive=0
                ;;
esac

echo \$-=$- interactive=$interactive 

# "maybe" interactive check
if [[ -t 0 ]]; then
        interactive=1
else
        interactive=0
fi

echo interactive=$interactive 

驚くべきことに、インタラクティブなのかどうかについて矛盾する答えを受けました。 bashプロンプトで実行したときの出力は次のとおりです。

$-=hB interactive=0
interactive=1

ちなみにMint 18には以下があります。

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redist

だから私の重要な質問は、「信頼できる」方法が間​​違った答えを生成するのはなぜですか? Bashがオプションに予想フラグを含めないのはなぜですか? 文書これを行う必要があることを示すようです。 「多分」バージョンは実際にはより安定していますか?

ベストアンサー1

「信頼できる」アプローチは、「このシェル」がスクリプトを起動したシェルではなく、対話型ではないスクリプトを実行するシェルであるため失敗します。

標準入力が端末([[ -t 0 ]])であることを確認する方がやや安定していますが、スクリプトが実行されている場所であるかどうかはまだ確認されていません。端末で実行されていない場合でも、スクリプトを正常に実行するcron方法があります。[[ -t 0 ]]

受け入れられた回答スクリプトを手動で呼び出すのではなく、cronで始まることを確認してください。私が見るのはもっと信頼できます。

おすすめ記事