bash:希望将管道命令中的错误发送到stderr,而不是屏幕

bash:希望将管道命令中的错误发送到stderr,而不是屏幕,bash,redirect,Bash,Redirect,在我的脚本中,如果我想为命令的输出设置一个变量,并避免命令无法进入屏幕时出现任何错误,我可以执行以下操作: var=$(command 2>/dev/null) 如果我将命令管道连接在一起,即 var=$(command1 | command2 | command3 2>/dev/null) 抑制来自任何命令的任何错误的优雅方式是什么。我不介意var没有设置,我只是不希望用户在屏幕上看到这些低级命令的错误;之后我想单独测试var 这里有一个例子,有两个,但我有一个命令链,所以我不

在我的脚本中,如果我想为命令的输出设置一个变量,并避免命令无法进入屏幕时出现任何错误,我可以执行以下操作:

var=$(command 2>/dev/null)
如果我将命令管道连接在一起,即

var=$(command1 | command2 | command3 2>/dev/null)
抑制来自任何命令的任何错误的优雅方式是什么。我不介意var没有设置,我只是不希望用户在屏幕上看到这些低级命令的错误;之后我想单独测试var

这里有一个例子,有两个,但我有一个命令链,所以我不想每次都将变量结果回送到下一个命令中

  res=$(ls bogusfile | grep morebogus 2>/dev/null)
您应该能够使用{}对多个命令进行分组:

var=$( { command1 | command2 | command3; } 2>/dev/null)
您应该能够使用{}对多个命令进行分组:

var=$( { command1 | command2 | command3; } 2>/dev/null)

将整个管道分成一组:

res=$( { ls bogusfile | grep morebogus; } 2>/dev/null)

将整个管道分成一组:

res=$( { ls bogusfile | grep morebogus; } 2>/dev/null)
您需要为管道中的每个命令重定向stderr:

res=$(ls bogusfile 2>/dev/null | grep morebogus 2>/dev/null)
或者,您可以将所有内容包装在一个子shell中,该子shell的输出被重定向:

res=$( (ls bogusfile | grep morebogus) 2>/dev/null)
您需要为管道中的每个命令重定向stderr:

res=$(ls bogusfile 2>/dev/null | grep morebogus 2>/dev/null)
或者,您可以将所有内容包装在一个子shell中,该子shell的输出被重定向:

res=$( (ls bogusfile | grep morebogus) 2>/dev/null)

您也可以使用exec 2>/dev/null为整个脚本重定向它,例如

注意:这将阻止交互式输出和显示提示。因此,您可以执行脚本,但不应仅在交互式shell中运行命令,或在没有初始返回行的情况下将其作为源代码。如果不重新定向文件描述符,您也将无法正常使用读取


您也可以使用exec 2>/dev/null为整个脚本重定向它,例如

注意:这将阻止交互式输出和显示提示。因此,您可以执行脚本,但不应仅在交互式shell中运行命令,或在没有初始返回行的情况下将其作为源代码。如果不重新定向文件描述符,您也将无法正常使用读取


谢谢Barmar,这三个不同的答案有什么不同,或者是用大括号,或者是你指出的两个?哪一个更有效?@Ray The parens,创建一个子shell。大括号{}只创建一个列表或组。组在当前shell中执行,这意味着它们可能更高效,但在大多数情况下,差异可能很小。感谢Barmar,使用大括号或您指出的两个答案之间的3个不同答案有什么区别?哪一个更有效?@Ray The parens,创建一个子shell。大括号{}只创建一个列表或组。组在当前shell中执行,这意味着它们可能更高效,但在大多数情况下,差异可能很小。感谢您的见解谢谢您的见解