2017-01-13 7 views
3

하는 FD가 사용 (하나의 입력 또는 출력으로)되면 :기존의 fd가 항상 입력과 출력으로 복제 될 수 있습니까? 배쉬

exec 7>AFile 

그 FD 번호가 모두 입력 또는 출력으로 중복 될 수 있다는 것을 보인다

true <&7; echo $? 
true >&7; echo $? 

:로 하나 개의 단어에 합류

fd=7 
rco="$(true >&${fd} 2>/dev/null; echo $?)" 
rci="$(true <&${fd} 2>/dev/null; echo $?)" 

그리고 모두 종료 값 : 테스트는 변수에 대해 반복 될 수있다

[[ "$rco$rci" = "11" ]] && echo "The fd number $fd is free" 

질문 :

가되는 조건은 "$rco$rci"의 종료 값이 "무료"FD 번호 11의 다릅니다.

다른 말로하면 : 또는 01 일 수 있습니까?

다른 껍질에있을 수 있습니까?

답변

3

후드에서 리디렉션은 기존 또는 무료 filedescriptor 인 dup을 시도하고 예비 리디렉션이 성공하면 쉘을 true으로 실행해야합니다.

은 항상 실패해야합니다. 이는 어느 방향으로 시도 된 하나의 시도가 filedescriptor가 열려 있는지 여부를 테스트하기에 충분하다는 것을 의미합니다.

(반대로, 공개 설명자에서 나오는 dup은 거의 항상 성공해야합니다. 프로세스 당 파일 크기 제한이 보통 1024-4096 인 경우 이론적으로는 실패합니다. 셸이 열린 플래그를 재설정하려고 시도했지만 dash, bash 및 zsh가이 작업을 수행하려고 시도하지 않습니다. 리디렉션 중이 아닌 이중 복사 읽기 전용 파일로 실제로 쓰려고하면 입출력 오류가 발생합니다.