测试stdin是文件还是管道还是tty



我知道对于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

相关内容

  • 没有找到相关文章

最新更新