测试中的Shell脚本输出管道不起作用

时间:2018-05-25 09:52:12

标签: shell piping dev-null

我试图以参数方式控制命令的错误输出,但管道命令作为另一个参数处理。测试下面的脚本;

...$ cat printOutput.sh 
#!/bin/sh
if [ $# -gt 0 ]; then echo "Wrong parameter $1"; exit; fi
echo "stdout"
echo "errout" >&2

...$ cat test.sh
#!/bin/sh
cmdBase="./printOutput.sh"
if [ -z $1 ]; then
    #Do not pipe
    cmd="$cmdBase"
else
    #Pipe err
    cmd="$cmdBase 2>/dev/null"
fi
echo "`$cmd`"

错误输出只应在选择了--verbose选项时打印,但无论如何都会打印。测试脚本显示2>/dev/null管道作为参数处理。

...$ ./test.sh --verbose
Wrong parameter 2>/dev/null

...$ sh -x ./test.sh --verbose
+ cmdBase=./printOutput.sh
+ [ -z --verbose ]
+ cmd=./printOutput.sh 2>/dev/null
+ ./printOutput.sh 2>/dev/null
+ echo Wrong parameter 2>/dev/null
Wrong parameter 2>/dev/null

为什么/如何将管道作为参数处理?

1 个答案:

答案 0 :(得分:0)

在我看来,输出重定向是在变量扩展之前处理的。

最明显的方法是在if声明中处理此问题:

#!/bin/sh
cmdBase="./printOutput.sh"

if [ -z $1 ]; then
   #Do not pipe
   cmdOut="`$cmdBase`"
else
   #Pipe err
   cmdOut="`$cmdBase 2>/dev/null`"
fi

echo "$cmdOut"