Sig*_*mun 16 bash stdout stderr
我想在我的bash脚本中测试stdout和stderr的定向,或者更确切地说,如果它们已被重定向.
你有个主意吗?
在$*bash的变量不给我这个信息.
je4*_*e4d 26
从技术上讲,没有办法告诉stdin/stdout/stderr是否被"重定向",因为你不知道调用你的脚本是什么.如果没有从另一个shell调用它,则没有"重定向"的概念.
您只需要输入/输出/错误文件描述符的类型(终端,fifo,管道,设备,文件等).通常,您只想检测输出是否进入某个用户的屏幕,或者是否进入另一个进程.在这种情况下[ -t 1 ],根据Mat的答案使用.
如果要查找重定向到的进程的位置/内容,请检查符号链接的目标/proc/$$/fd/1和/proc/$$/fd/2.
请注意,有人可以将您的进程输出连接到另一个终端./myscript.sh > /dev/pts/1234.然后它会被"重定向",但是stdout仍然是一个终端.
例子:
$ ls -l /proc/$$/fd/1 > results
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0
$ cat results
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798]
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0
Run Code Online (Sandbox Code Playgroud)
[ -t 1 ] 第1和第4会是如此.
Mat*_*Mat 23
您应该能够使用-t测试开关来判断输出流是否为ttys:
if [ -t 1 ] ; then
echo stdout is a terminal
else
echo stdout is not a terminal
fi
Run Code Online (Sandbox Code Playgroud)
使用-t 0了stdin.
使用-t 2了stderr.
| 归档时间: |
|
| 查看次数: |
4780 次 |
| 最近记录: |