检测shell脚本的输出流类型

时间:2009-05-26 17:26:12

标签: linux unix shell scripting

我正在编写一个在命令行上使用ANSI颜色字符的shell脚本。

示例: example.sh

#!/bin/tcsh
printf "\033[31m Success Color is awesome!\033[0m"

我的问题在于:

$ ./example.sh > out

$./example.sh | grep 

ASCII码将与文本一起原始发送出来,混淆输出并且通常会造成混乱。

我很想知道是否有办法检测到这一点,所以我可以为这种特殊情况禁用颜色。

我已经在tcsh手册页和网页上搜索了一段时间,但还没找到任何特定于shell的内容。

我不一定要tcsh,这是我们的团队标准......但谁在乎呢?

是否可以在shell脚本中检测您的输出是否被重定向或管道?

4 个答案:

答案 0 :(得分:13)

请参阅此previous SO question,其中包含bash。 Tcsh提供与filetest -t 1相同的功能,以查看标准输出是否为终端。如果是,则打印颜色,否则将其留下。这是tcsh:

#!/bin/tcsh
if ( -t 1 ) then
        printf "\033[31m Success Color is awesome!\033[0m"
else
        printf "Plain Text is awesome!"
endif

答案 1 :(得分:6)

在bourne shell脚本(sh,bask,ksh,...)中,您可以将标准输出提供给tty程序(Unix中的标准),它告诉您输入是否为tty ,使用-s标志。

将以下内容放入“check-tty”:

    #! /bin/sh
    if tty -s <&1; then
      echo "Output is a tty"
    else
      echo "Output is not a tty"
    fi

试一试:

    % ./check-tty
    Output is a tty
    % ./check-tty | cat
    Output is not a tty

我不使用tcsh,但必须有办法将标准输出重定向到tty的标准输入。如果没有,请使用

    sh -c "tty -s <&1"

作为tcsh脚本中的测试命令,检查其退出状态,然后就完成了。

答案 2 :(得分:3)

问题detect if shell script is running through a pipe中包含对输出流类型的检测。

确定您正在与终端通话后,您可以使用tput为您正在使用的特定终端检索正确的转义码 - 这将使代码更具便携性。

示例脚本(bash恐怕,因为tcsh不是我的强项),如下所示。

#!/bin/bash

fg_red=
fg_green=
fg_yellow=
fg_blue=
fg_magenta=
fg_cyan=
fg_white=
bold=
reverse=
attr_end=

if [ -t 1 ]; then
    fg_red=$(tput setaf 1)
    fg_green=$(tput setaf 2)
    fg_yellow=$(tput setaf 3)
    fg_blue=$(tput setaf 4)
    fg_magenta=$(tput setaf 5)
    fg_cyan=$(tput setaf 6)
    fg_white=$(tput setaf 7)
    bold=$(tput bold)
    reverse=$(tput rev)
    underline=$(tput smul)
    attr_end=$(tput sgr0)
fi

echo "This is ${fg_red}red${attr_end}"
echo "This is ${fg_green}green${attr_end}"
echo "This is ${fg_yellow}yellow${attr_end}"
echo "This is ${fg_blue}blue${attr_end}"
echo "This is ${fg_magenta}magenta${attr_end}"
echo "This is ${fg_cyan}cyan${attr_end}"
echo "This is ${fg_white}white${attr_end}"
echo "This is ${bold}bold${attr_end}"
echo "This is ${reverse}reverse${attr_end}"
echo "This is ${underline}underline${attr_end}"

有关详细信息,请参阅“man tput”和“man terminfo” - 可以使用各种转义码。

答案 3 :(得分:-2)

据我所知,无法确定shell脚本输出的最终目的地;你唯一能做的就是提供一个开关,它可以抑制输出中的控制字符。