이 리디렉션이 유효합니까? '2<&1'

이 리디렉션이 유효합니까? '2<&1'

이전에 작업했던 서버에서 주석을 발견했지만 리디렉션이 올바르지 않은 것 같습니다. 누군가 확인할 수 있을까요?

이는 이 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>&1cronjob의 출력과 오류를 보존하는 간단한 방법으로 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에 쓰는 것은 실패하지 않으며 /stopoutfd 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 +++

관련 정보