나는 모든 *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>&1
POSIX 표준 준수를 명시적으로 선언합니다 . 이것은 >&
연산자( 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
stdout
stderr
POSIX 호환 방식으로 파일을 리디렉션하고 파일로 리디렉션하는 가장 좋은 방법은 무엇입니까?
답변1
당신은 확인할 수 있습니다POSIX 사양. 언어가 항상 이해하기 쉬운 것은 아니지만, 찾고 있는 것이 무엇인지 안다면 그것이 거기에 있는지 확인할 수 있습니다.
POSIX에는 리디렉션 작업이 포함되어 있습니다.N>&word
N<&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>&1
a
3
foo >myfile 2>&1
a
myfile
echo foo &>bar
echo foo
&
>bar
foo
bar