20

我希望我的 shell 检测是否是人类行为,然后显示提示。

所以,假设文件名是 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条目man bash),没有必要使用 beefy&&||shell 运算符来组合命令的两个单独运行[,因为该[命令具有自己的内置and -a and or -o运算符,可以让您组合几个更简单的测试成一个单一的结果。

因此,您可以通过以下方式实现您所要求的测试——如果输入输出已被重定向离开 TTY,您将进入批处理模式——使用单个调用[

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