我遇到了我以前工作过的服务器的注释,但重定向看起来不正确。也许有人可以证实?
这些是我的 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>&1
或2<&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 +++