이전에 작업했던 서버에서 주석을 발견했지만 리디렉션이 올바르지 않은 것 같습니다. 누군가 확인할 수 있을까요?
이는 이 HP-UX 서버에서 실행되는 응용 프로그램/데이터베이스를 유지 관리하는 타사 공급업체가 만든 내 crontab의 항목입니다.
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
cronjob의 출력과 오류를 보존하는 간단한 방법으로 crontab에서 흔히 발생합니다(참조).그래서,대학 및 대학교,아프리카 연합,...).
알아채다:
- 여기서 fd 1은 쓰기 위해 열렸습니다(
>/stopout
와 동일1>/stopout
). - 이 작업을 수행하든 fd 2를
2>&1
수행2<&1
하든 다음을 얻게 됩니다.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 +++