Unix重定向问题:& - 2>& - &

时间:2013-12-01 15:00:32

标签: shell unix

Unix重定向:

最近我遇到了一个问题,其中一个脚本使用下面的命令在后台执行它。问题是脚本在启动时执行了两次。

例如:

在脚本中我将回显“Hello”打印到日志文件。当脚本执行时,我在日志文件中看到它同时打印了两次。任何人都可以告诉我这里两次执行脚本的原因。

nohup <runScript> </dev/null 1>&- 2>&- &

1 个答案:

答案 0 :(得分:1)

您问题的原始版本有点令人困惑。主题行询问(推断命令和参数):

somecmd arg1 </dev/null 1>&- 2>&- &

问题的主体似乎在询问:

nohup &- 2>&- &

可以合理推断为:

nohup somecmd arg1 &- 2>&- &

您的问题的编辑版本也令人困惑 - 尽管更改只是缩进代码片段。当您询问I / O重定向时,符号<runscript>被选中。我猜你写的<runscript>等同于我写somecmd,而不是重定向runscript的标准输入和错误的输出重定向。但是,经过修订 代码至少与主题行匹配:

nohup runScript </dev/null 1>&- 2>&- &

所以,我会忽略&-符号(此答案的先前版本没有)。

表示法</dev/null 1>&- 2>&- &

第一个命令行从/dev/null重定向标准输入,并关闭标准输出和标准错误并在后台执行命令。从/dev/null重定向是好的;关闭标准输出和标准错误不是很好 - 程序有权打开这三个文件描述符,这可以通过重定向到/dev/null来完成:

somecmd arg1 </dev/null >/dev/null 2>&1 &

或:

somecmd arg1 </dev/null >/dev/null 2>/dev/null &

这两者之间差别不大。

双击

任何代码中都没有任何内容可以解释脚本运行两次,或者输出出现在日志文件中两次。由于您尚未显示已运行的脚本,因此我们无法从中推断出任何原因。总的来说,收费将是“操作员错误” - 您设法运行命令两次。如果您希望我们调查,您必须提供可重现的脚本:

  • 显示要运行的脚本。
  • 清空日志文件。
  • 使用您选择的符号运行脚本一次。
  • 显示日志文件包含两个条目。

如果没有这样一个可重复的脚本,没有任何人可以帮助你。