这个重定向有效吗? '2

这个重定向有效吗? '2

我遇到了我以前工作过的服务器的注释,但重定向看起来不正确。也许有人可以证实?

这些是我的 crontab 中由第三方供应商输入的条目,他们维护在此 HP-UX 服务器中运行的应用程序/数据库。

15 21 * * 0-6 /usr/sys/bin/stop  q  >/stopout   2<&1 #
30 21 * * 0-6 /usr/sys/force     q  >/out       2<&1 #
55 23 * * 0-6 /usr/sys/start     q  >/startout  2<&1 #

我在 Bash 手册中找到了这一点,但这意味着 stderr 和 stdout 将转到 >/{stopout,out,startout} 而 stderr 正在复制 stdout (这意味着 stdout 两次被写入 stopout,out,startout?)?我很困惑 :)

3.6.8 Duplicating File Descriptors
The redirection operator

[n]<&word
is used to duplicate input file descriptors. If word expands to one or more 
digits, the file descriptor denoted by n is made to be a copy of that file 
descriptor. If the digits in word do not specify a file descriptor open for 
input, a redirection error occurs. If word evaluates to ‘-’, file descriptor n 
is closed. If n is not specified, the standard input (file descriptor 0) is 
used.

答案1

这很可能是一个拼写错误2>&1>foo 2>&1在 crontab 中很常见,作为保留 cronjobs 的输出和错误的简单方法(请参阅所以,大学与大学,非盟,...)。


注意:

  • 这里的fd 1已经被打开用于写入(>/stopout等价于1>/stopout
  • 无论你这样做2>&12<&1,fd 2 都会得到dup2'd(至少在 Linux 上,但想必在其他平台上也是如此)到 fd 1,因此它可以以与 fd 1 相同的方式使用。
    • 这并不意味着写入 fd 1 的数据将被发送到 fd 2 作为输入,而是 fd 1 和 2 指向相同的东西。
  • 因此写入 fd 2 不会失败,并且会/stopout像写入 fd 1 的任何数据一样被发送。

但是,如果 fd 1 最初打开用于读取,则写入其中任何一个都会失败:

$ strace -e write bash -c 'echo bar 1<foo 2<&1'
write(1, "bar\n", 4)                    = -1 EBADF (Bad file descriptor)
write(2, "bash: line 0: echo: write error:"..., 53) = -1 EBADF (Bad file descriptor)
+++ exited with 1 +++

相关内容