리디렉션을 사용한 bash 명령 대체: 잘못된 파일 설명자

리디렉션을 사용한 bash 명령 대체: 잘못된 파일 설명자

다음 명령은 대시에서 작동하지만 "잘못된 파일 설명자"로 인해 bash에서는 실패합니다.

$ dash -c 'out=$(echo "to fd3" >&3; echo "to stdout") 3>&1; echo "out: $out"'
to fd3
out: to stdout

$ bash -c 'out=$(echo "to fd3" >&3; echo "to stdout") 3>&1; echo "out: $out"'
bash: 3: Bad file descriptor
out: to stdout

명령 대체를 서브쉘로 바꾸면 대시와 bash에서 작동하는 것 같습니다.

$ dash -c '(echo "to fd3" >&3; echo "to stdout") 3>&1'
to fd3
to stdout

$ bash -c '(echo "to fd3" >&3; echo "to stdout") 3>&1'
to fd3
to stdout

버전:

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-unknown-linux-gnu)

대시 버전을 얻는 방법을 잘 모르겠습니다. 내 시스템의 매뉴얼 페이지 날짜는 2003년 1월 19일입니다.


연구:

bash와 dash가 명령을 실행하는 방법을 확인했습니다. 이것이 내가 찾은 것입니다.

배쉬의 경우:https://www.gnu.org/software/bash/manual/bashref.html#Shell-Operation

대시의 경우:http://man7.org/linux/man-pages/man1/dash.1.html("간단한 명령" 섹션)

내가 이해하는 바에 따르면 둘 다 리디렉션하기 전에 확장됩니다. 명령 대체는 확장입니다. 따라서 파일 설명자 3이 명령 대체에 설정되지 않은 것이 합리적입니다.

대시에서 작동하는 이유는 무엇입니까? 왜 bash에서는 작동하지 않습니까? 이거 대시 버그인가요? 아니면 배쉬? 그것은 전혀 유효한 구조입니까?

답변1

할당 확장 전 또는 후에 리디렉션이 수행되는지 여부명령이 없으면 POSIX가 지정되지 않습니다.이므로 둘 다 유효하며 어느 쪽에도 의존할 수 없습니다. 따라서 이식성을 위해서는 다음이 필요합니다.

{ out=$(echo "to fd3" >&3; echo "to stdout"); } 3>&1

AT&T ksh및 Bourne 쉘은 이 예와 유사하게 작동 합니다 bash.zshpdkshyashdash

관련 정보