【问题标题】:How can i suppress output from a command in bash without making its variable empty如何在不使其变量为空的情况下抑制 bash 中命令的输出
【发布时间】:2021-07-06 13:15:12
【问题描述】:
check="$(cat "$HOME/log.txt" | grep 'some_string')"

if [ -z "${check}" ] ; then
  echo "string not found"
else
  echo "string found"
fi

在我的 bash 脚本中,我正在检查文件中的字符串,并通过检查变量是否为空来输出是否找到了字符串。很简单。 所以问题是当这个 $HOME/log.txt 文件不存在时,它会输出

cat: /home/user/log.txt: No such file or directory
string not found

这里并没有真正的错误,但我想抑制“没有这样的文件或目录”消息,我只是想使用 &>/dev/null 和 cat 命令来抑制这个,但是如果我这样做 check="$(cat "$HOME/log.txt" &>/dev/null | grep 'some_string')" ,结果@ 987654325@ 变量总是为空,因此它总是说没有找到字符串,即使它实际上在那里

如何抑制 cat 命令的输出并保留其变量值?

【问题讨论】:

  • &>/dev/null 替换为2>/dev/null ?
  • 这似乎运作良好,谢谢。如果你能把它作为答案,我一定会接受的。 &>/dev/null && 2>/dev/null 之间的一个简短的区别会让它变得完美
  • grep 'some_string' "$HOME/log.txt" 2>/dev/null 应该在没有猫和管道的情况下做同样的事情

标签: bash stderr io-redirection


【解决方案1】:

&>/dev/null 替换为2>/dev/null

check="$(cat "$HOME/log.txt" 2>/dev/null | grep 'some_string')"

以下是重定向工作原理的简要总结:

  • 2>/dev/null 只会重定向标准错误;
  • 1>/dev/null>/dev/null 只会重定向标准输出。
  • &>/dev/null 将重定向标准输出和标准错误(不是 POSIX);

【讨论】:

  • 考虑在完整性解释中也包括>/dev/null
  • 添加到答案中,1>/dev/null 通常>/dev/null 只会重定向标准输出。另请注意,&>/dev/null 不是 POSIX 标准,在某些 shell 中可能不起作用。
  • @kevinnls 已编辑
猜你喜欢
  • 2010-10-11
  • 2021-12-17
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多