检查bash脚本中是否有stdout重定向

Jac*_*t65 10 linux bash

我需要检查我的程序的输出是否被重定向; 如果是的话我需要保留并通过邮件发送.

例:

$ myprogram -param1 -param2 -param3 > /home/polly/log.txt
Run Code Online (Sandbox Code Playgroud)

myprogram.sh:

if 'redirection is not empty'; then 
    cat <redirection name> | mailx -s "This is a test email." polly@gmail.com 
fi 
Run Code Online (Sandbox Code Playgroud)

hek*_*mgl 12

您可以检查stdout是否是终端.当stdout被重定向或管道传输时,它将不是终端.您可以使用带有-t选项的test命令来获取此信息:

if [ -t 1 ] ; then
    # stdout is a terminal
else
    # stdout isn't a terminal
fi
Run Code Online (Sandbox Code Playgroud)

来自man test:

  -t FD  file descriptor FD is opened on a terminal
Run Code Online (Sandbox Code Playgroud)

  • @ hek2mgl嗯,在Linux上,你可能实际上能够,至少对于重定向(不是管道,虽然没有名称),通过查看例如`readlink/proc/$$/fd/1`等. .. (4认同)
  • @hek2mgl,不能同意“良好的程序设计”,这取决于。比如说 /bin/ls /usr/bin/diff 这样的基本实用程序。(1) ls 向终端提供表格输出,但在重定向输出时每行提供一个输出。(2) diff 可以使用带有 ANSI 转义码的彩色输出,但重定向时默认情况下会进行纯黑白输出。因此,在某些情况下,良好的程序设计需要知道 stdout 是否是终端 (2认同)