【问题标题】:Shell Script output piping in test does not work测试中的 Shell 脚本输出管道不起作用
【发布时间】:2018-11-04 16:27:14
【问题描述】:

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

...$ 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

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

【问题讨论】:

标签: shell piping dev-null


【解决方案1】:

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

最明显的方法是在您的 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"

【讨论】:

  • 实际命令要长得多,会被多次调用。在这种情况下会有很多代码重复。
  • 您可以将其包装成一个函数,该函数将根据参数解析期间设置的变量为您执行`"$@" 2>/dev/null`
  • 谢谢。函数包装工作。生成的脚本看起来像; cmdBase="./printOutput.sh"; fnc(){ echo `$cmdBase $@`; } fnc 2>/dev/null;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2018-05-27
  • 2019-07-25
  • 1970-01-01
  • 2021-06-15
  • 2016-01-17
相关资源
最近更新 更多