【问题标题】:How do I redirect stdout/stderr when also using the input redirection operator `<`?当还使用输入重定向运算符“<”时,如何重定向 stdout/stderr?
【发布时间】:2018-08-24 21:49:01
【问题描述】:

我有一个执行此操作的 bash 脚本:

#!/bin/bash
# $1 = database dump
# $2 = mysql connect command
$2 < $1

最后一部分将输出打印到我不想要的 stdout 和 stderr。但是,我不知道如何最好地进行 &gt; /dev/null 2&gt;&amp;1 样式重定向,因为我已经在进行输入重定向。

【问题讨论】:

  • 顺便说一句,报价很重要。如果您的文件名包含空格,&lt; $1 将失败,而 &lt; "$1" 不会。 (在单个参数中传递命令几乎总是有问题;请参阅 mywiki.wooledge.org/BashFAQ/050 了解原因的完整描述)
  • 好的做法是:dump=$1; shift; "$@" &lt;"$dump",将您的命令作为一系列单独的参数传递;也就是说,像./yourscript dumpfile mysql -u username 这样的东西——这样任何参数(文件名、MySQL 的其他参数等)都可以有引号/空格/等。并且仍然得到正确处理。

标签: bash shell stdout stderr io-redirection


【解决方案1】:

顺序无所谓。你可以把&lt; "$1"放在&gt;/dev/null 2&gt;&amp;1之前或之后:

  • "$2" &lt; "$1" &gt;/dev/null 2&gt;&amp;1
  • "$2" &gt;/dev/null 2&gt;&amp;1 &lt; "$1"

正如 Charles Duffy 指出的那样,不要忘记将 $1$2 变量放在引号内

【讨论】:

  • 一些订单很重要:2&gt;&amp;1 还是要关注&gt;/dev/null
  • 点头。希望 OP 没有做类似./scriptname dumpfile "mysql -u username" 的事情——但在这种情况下,他们遇到了需要更大修复的问题(即更改为./scriptname dumpfile mysql -u username)。但是,如果没有详细的用法,除了推测之外很难做任何事情。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2011-07-22
  • 2019-10-11
  • 2012-09-25
  • 2022-01-18
  • 2015-09-02
  • 2018-01-25
相关资源
最近更新 更多