【问题标题】:Bash redirect heredoc output to /dev/null [duplicate]Bash将heredoc输出重定向到/dev/null [重复]
【发布时间】:2019-10-11 15:41:44
【问题描述】:

我有一个调用 psql 并执行 SQL 代码的 bash 脚本:

sudo -i -u postgres psql <<EOF
SQL COMMANDS;
EOF 

SQL 部分生成大量输出,我想将其重定向到 /dev/null。如何将 heredoc 重定向到 /dev/null ?

【问题讨论】:

  • 您不想重定向 heredoc。实际上,heredoc 一个重定向,因为它重定向了postgres 的stdin。您想重定向 postgres 命令的 输出。这是由&gt;/dev/null 完成的。请注意,这不会重定向标准错误。
  • 尊敬的链接问题是关于管道到文件;从该答案中不清楚您是否可以类似地处理 STDOUT 和 STDERR。这个答案就是这样做的。

标签: bash io-redirection heredoc


【解决方案1】:

琐碎

postgres psql <<EOF >/dev/null
  SQL COMMANDS;
EOF 

&lt;&lt; token heredoc 分隔符只是另一个重定向运算符;所以你可以做类似的事情

postgres psql <<EOF 2>/dev/null |
  SQL COMMANDS;
EOF
while IFS= read -r output; do
    case $output in
      *error*) printf '%s%s%s\n' "$red" "$output" "$plain";;
        *) echo "$output";;
    esac
done

从第一行开始的管道在EOF 令牌之后继续。 (这需要您分别为红色和非彩色文本定义屏幕控制代码;man tput。)

【讨论】:

  • 我不知道 postgres 是如何产生其输出的,但您的解决方案假设错误消息被写入标准输出,而不是标准错误,因为您正在丢弃标准错误,这不是一个好主意 IMO .
  • 实际上,我只是提供了一个示例,其中数据库本身的某些输出有时包含应突出显示的文本“错误”。感谢您的评论;它可能可以帮助人们更好地理解这一点。
  • 谢谢,这就是我尝试过的,但它在 EOF 处引发了错误。然后我发现它是由 EOF 处的尾随空格引起的。
猜你喜欢
  • 2012-01-04
  • 2018-05-13
  • 2012-08-15
  • 2023-03-06
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多