20

シェルが人間の行動を検出してから、プロンプトを表示するようにします。

したがって、ファイル名が test.bash であるとします。

#!/bin/bash
if [ "x" != "${PS1:-x}" ] ;then
 read -p "remove test.log Yes/No" x
 [ "$x" = "n" ] && exit 1
fi
rm -f test.log

しかし、PS1を設定しないと動かないことがわかりました。より良い方法はありますか?

私のテスト方法:

./test.bash                  # human interactive
./test.bash > /tmp/test.log  # stdout in batch mode
ls | ./test.bash             # stdin in batch mode
4

4 に答える 4

47

詳しく説明すると、試してみます

 if [ -t 0 ] ; then
    # this shell has a std-input, so we're not in batch mode 
   .....
 else
    # we're in batch mode

    ....
 fi

これが役立つことを願っています。

于 2012-04-05T03:45:05.253 に答える
9

からhelp test:

 -t FD          True if FD is opened on a terminal.
于 2012-04-05T03:34:04.093 に答える
7

プログラムを利用できます/usr/bin/tty

if tty -s
then
    # ...
fi

移植性がどの程度かはわかりませんが、少なくとも GNU coreutils の一部です。

于 2012-04-05T03:40:44.880 に答える
3

bash スクリプト ( のtest exprエントリを参照) では、コマンドの 2 つの個別の実行を結合するために、強力な演算子とシェル演算子を使用man bashする必要はありませより単純なテストを単一の結果に。&&||[[ -a -o

したがって、ここでは、要求したテストを実装する方法を示します —入力または出力のいずれかが TTY からリダイレクトされた場合にバッチ モードに切り替えます — の 1 回の呼び出しを使用します。[

if [ -t 0 -a -t 1 ]
then
    echo Interactive mode
else
    echo Batch mode
fi
于 2015-07-15T16:20:59.637 に答える