我知道对于bash和zsh,可以使用例如[ -t 1 ]
来确定STDIN是否是交互式tty会话。
然而,似乎没有一种方法可以测试stdin是否从文件重定向,而不是从命令管道输入:
foo < ./file
bar | foo
有什么方法可以检测出这两者之间的区别吗?另外,是否有任何方法可以获取重定向文件的路径(在macOS上不可用的/proc/self之外(?
您可以检查/dev/stdin
是常规文件还是管道:
$ cat tmp.sh
#!/bin/bash
if [ -f /dev/stdin ]; then
echo "file"
elif [ -p /dev/stdin ]; then
echo "pipe"
fi
$ bash tmp.sh < foo.txt
file
$ echo foo | bash tmp.sh
pipe
不过,这依赖于文件系统中的/dev/stdin
。
您还可以使用stat
命令,该命令将在没有文件名参数的情况下返回有关标准输入的信息。正如您所提到的,您正在使用macOS,您可以使用%HT
格式:
$ stat -f %HT
Character Device
$ stat -f %HT < foo.txt
Regular File
$ echo foo | stat -f %HT
Fifo File