bash:希望来自管道命令的错误转到stderr,而不是屏幕

时间:2015-09-02 22:45:18

标签: bash redirect

在我的脚本中,如果我想为命令的输出设置一个变量并避免命令失败进入屏幕的任何错误,我可以这样做:

var=$(command 2>/dev/null)

如果我有命令管道,即

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

什么是抑制来自任何命令的任何错误的优雅方法。我不介意如果没有设置var,我只是不希望用户在屏幕上看到这些“低级命令”的错误;我想在之后单独测试var。

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

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

4 个答案:

答案 0 :(得分:2)

您应该能够使用{}对多个命令进行分组:

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

答案 1 :(得分:2)

将整个管道放在一个组中:

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

答案 2 :(得分:2)

您需要为管道中的每个命令重定向stderr

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

或者您可以将所有内容都包装在其输出重定向的子shell中:

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

答案 3 :(得分:1)

您也可以使用exec 2>/dev/null(例如

)将其重定向到整个脚本
#!/bin/bash

return 2>/dev/null # prevent sourcing

exec 3>&2 2>/dev/null 

# file descriptor 2 is directed to /dev/null for any commands here

exec 2>&3

# fd 2 is directed back to where it was originally for any commands here
  

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