stdout 및 stderr을 파일로 리디렉션하는 POSIX 호환 방법

stdout 및 stderr을 파일로 리디렉션하는 POSIX 호환 방법

나는 모든 *nix 시스템(Debian, Fedora, CentOS, AIX, Arch... 모두)에서 실행될 수 있도록 POSIX 호환 스크립트를 작성하려고 합니다. 리디렉션과 관련하여 POSIX가 지원하는 것과 지원하지 않는 것이 무엇인지 매우 혼란스럽습니다.

ls -l file missingfile &> out.txt이것을 리디렉션하면 bash존재 stderr하지 않는 줄에 대해 불평하고 missingfile출력 권한은 file에 있습니다 out.txt. 그러나 나는 이 쉘이 POSIX 표준 연산자 이상을 지원하기 때문에 이것이 작동한다고 믿습니다. 이 질문을 조사하는 동안 상충되는 답변을 발견했습니다.

이 스택 교환 답변&>예를 들어 , >&, >>&&>>비표준 연산임을 암시하는 것 같습니다 . 하지만,이 답변some-program > some_file 2>&1POSIX 표준 준수를 명시적으로 선언합니다 . 이것은 >&연산자( stderr& 를 사용하는 숫자 stdout)가 POSIX를 준수하는 반면 &>자동 리디렉션을 사용 stderr하고 stdout파일이 POSIX를 준수한다는 것을 의미합니까?아니요POSIX와 호환됩니까? 아니면 둘 다 POSIX 규격 &>이고 >&POSIX 규격/POSIX 규격이 아닙니다(이 두 사람 중 한 명이 틀렸습니다)?

나는 &플래그를 완전히 피하고 를 사용하는 것을 고려했지만 ls -l file missingfile >out.txt 2>out.txt그 자체의 문제가 있습니다. 이런 방식으로 명령을 실행하면 ls쉘이 out.txt파일의 오프셋 0을 가리키는 두 개의 파일 핸들을 열게 됩니다. 따라서 ls이 두 파일을 검색하면 메시지 중 하나가 손상됩니다.

ls -l file missingfile >out.txt 2>out.txt출력은 다음 과 같습니다.

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
ls: cannot access 'missingfile': No such file or directory

실제 출력은 무엇입니까?

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
le or directory

stdoutstderrPOSIX 호환 방식으로 파일을 리디렉션하고 파일로 리디렉션하는 가장 좋은 방법은 무엇입니까?

답변1

당신은 확인할 수 있습니다POSIX 사양. 언어가 항상 이해하기 쉬운 것은 아니지만, 찾고 있는 것이 무엇인지 안다면 그것이 거기에 있는지 확인할 수 있습니다.

POSIX에는 리디렉션 작업이 포함되어 있습니다.N>&wordN<&word질소선택적 파일 설명자 번호입니다(기본값은 입력의 경우 0, 출력의 경우 1).단어할 수 있다:

  • 파일 설명자를 리디렉션하는 데 사용되는 일련의 번호질소이미 열려 있는 것단어.
  • 문자 -, 파일 설명자 닫기질소.

>out.txt 2>&1표준 출력과 표준 오류를 POSIX 호환 메서드로 리디렉션하는 경우에도 마찬가지입니다 out.txt. POSIX 이전 버전에서도 작동합니다.본 껍질.

>& 그 뒤에 파일 이름이 옵니다.stdout 및 stderr을 이 파일로 리디렉션하는 일부 쉘(bash 포함)의 확장입니다.

&>>&bash(및 zsh) 뒤에 파일 이름이 오는 동의어입니다. 파일 이름이 일련의 숫자인 경우에도 작동한다는 장점이 있습니다 -(예 : if is digital foo >&"$a"과 동일 하지만 if is is 와 동일 ). 단점은 POSIX와 호환되지 않는다는 것입니다. POSIX 호환 셸에서 명령 , 연산자, 명령 으로 구문 분석됩니다 . 즉, 인쇄를 위한 백그라운드 프로세스 와 파일 생성 또는 삭제를 위한 포그라운드 프로세스입니다 .foo 1>&3 2>&1a3foo >myfile 2>&1amyfileecho foo &>barecho foo&>barfoobar

관련 정보