关于bash中交互式检测的问题

关于bash中交互式检测的问题

我有一个关于 bash 中交互式检测的问题。

无论是否以交互模式调用,都会打印以下脚本。

$ cat int.sh 
#!/bin/bash

if [ -t 0 ]; then
    echo "interactive"
else
    echo "not interactive"
fi

有些调用示例...

$ ./int.sh 
interactive
$ echo toto | ./int.sh
not interactive
$ ./int.sh < ./int.sh
not interactive
$ ./int.sh <<EOF
> hello world!
> EOF
not interactive

但为什么下面的案例结果是交互式的呢?

$ ./int.sh <( cat ./int.sh )
interactive

答案1

bash中的语句<(...)流程替代。中的进程<(...)运行时其输入或输出连接到 FIFO 或 中的某个文件/dev/fd。查看它:

echo <(echo foo)

它打印类似的东西/dev/fd/63。那是文件描述符。然后该<(...)部分将替换为该文件描述符。因此,在您的声明中,调用将是例如:

./int.sh <( cat ./int.sh )

替换为:

./int.sh /dev/fd/63

因此,它只是脚本的一个参数./int.sh,仍然以交互方式调用。

相关内容