Shell 测试中的脚本输出管道不起作用
Shell Script output piping in test does not work
我试图通过参数控制命令的错误输出,但管道命令作为另一个参数处理。下面的测试脚本;
...$ cat printOutput.sh
#!/bin/sh
if [ $# -gt 0 ]; then echo "Wrong parameter "; exit; fi
echo "stdout"
echo "errout" >&2
...$ cat test.sh
#!/bin/sh
cmdBase="./printOutput.sh"
if [ -z ]; then
#Do not pipe
cmd="$cmdBase"
else
#Pipe err
cmd="$cmdBase 2>/dev/null"
fi
echo "`$cmd`"
只有在选择 --verbose 选项时才会打印错误输出,但它会打印 anyways.Test 脚本显示 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
Why/How这里管道是作为参数处理的吗?
在我看来,输出重定向是在变量扩展之前处理的。
最明显的方法是在您的 if
语句中处理此问题:
#!/bin/sh
cmdBase="./printOutput.sh"
if [ -z ]; then
#Do not pipe
cmdOut="`$cmdBase`"
else
#Pipe err
cmdOut="`$cmdBase 2>/dev/null`"
fi
echo "$cmdOut"
我试图通过参数控制命令的错误输出,但管道命令作为另一个参数处理。下面的测试脚本;
...$ cat printOutput.sh
#!/bin/sh
if [ $# -gt 0 ]; then echo "Wrong parameter "; exit; fi
echo "stdout"
echo "errout" >&2
...$ cat test.sh
#!/bin/sh
cmdBase="./printOutput.sh"
if [ -z ]; then
#Do not pipe
cmd="$cmdBase"
else
#Pipe err
cmd="$cmdBase 2>/dev/null"
fi
echo "`$cmd`"
只有在选择 --verbose 选项时才会打印错误输出,但它会打印 anyways.Test 脚本显示 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
Why/How这里管道是作为参数处理的吗?
在我看来,输出重定向是在变量扩展之前处理的。
最明显的方法是在您的 if
语句中处理此问题:
#!/bin/sh
cmdBase="./printOutput.sh"
if [ -z ]; then
#Do not pipe
cmdOut="`$cmdBase`"
else
#Pipe err
cmdOut="`$cmdBase 2>/dev/null`"
fi
echo "$cmdOut"