我有一个关于 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
,仍然以交互方式调用。