Bash将STDERR与字符串进行比较



我想得到一个命令的标准错误,并比较它是否包含一些字符串:我创建了这个脚本:

SONARQUBE_SCANNER_HOME=/var/lib/sdon
if msg=$(/var/lib/dtt 2>&1)
then
echo "Command has is working fine!"
else
if [[ "$(echo $msg | grep -i 'No such file or directory')" = 'No such file or directory' ]]
then
echo "Command Path was not found. Not a code issue! Build will now be UNSTABLE!"
exit 0
else
echo "It is something else"
fi
fi
~

但是输出是

+ SONARQUBE_SCANNER_HOME=/var/lib/sdon
++ /var/lib/dtt
+ msg='test: line 4: /var/lib/dtt: No such file or directory'
++ echo test: line 4: /var/lib/dtt: No such file or directory
++ grep -i 'No such file or directory'
+ [[ test: line 4: /var/lib/dtt: No such file or directory = No such file or directory ]]
+ echo 'It is something else'

正如你所看到的,由于一些奇怪的原因,它无缘无故地分裂了没有这样的文件或目录。最后只是将命令的错误与某个字符串进行比较,但这似乎失败了。

if [[ "$(echo $msg | grep -i 'No such file or directory')" = 'No such file or directory' ]]应为if grep --ignore-case --quiet 'No such file or directory' <<< "$msg":

  1. grep返回整行;测试:第4行:/var/lib/dtt:";位,它不等于您在[[命令中查找的文本。您可以使用--only-matching只打印行中与正则表达式匹配的部分
  2. 如果grep找到匹配项,则退出并返回代码0
  3. 由于您不需要打印匹配项(并加快在较大输入中的存在性检查(,因此可以使用--quiet在找到匹配项后立即退出,而无需打印
  4. if只检查命令是否在返回退出代码零后[[只是另一个命令,与grep类似
  5. 长选项名称(虽然在grep所有化身中都不可用(使命令的作用变得明显,而不是模糊
  6. 您很少需要使用echo(或cat,另一个经常被滥用的命令(来将内容发送到标准的命令输入。这里的字符串在这种情况下很方便
  7. 最后,使用更多报价™ :)

最新更新