~에서 GNU Bash 참조 매뉴얼, 섹션 3.6 리디렉션:
Bash는 다음 표에 설명된 대로 리디렉션에서 여러 파일 이름을 사용할 때 특별히 여러 파일 이름을 처리합니다.
/dev/fd/fd
만약에FD유효한 정수, 파일 설명자입니다.FD반복됩니다.
/dev/stdin
파일 설명자 0이 중복되었습니다.
/dev/stdout
파일 설명자 1이 중복되었습니다.
/dev/stderr
파일 설명자 2가 중복되었습니다.
여기서 "반복"이란 무엇을 의미합니까? 몇 가지 예를 들어주실 수 있나요?
(위 내용은 에서 발췌한 내용입니다.버전 4.3, 마지막 업데이트 날짜: 2014년 2월 2일,GNU Bash 참조 매뉴얼,버전 4.3의 경우 Bash
. )
답변1
리디렉션은 다음에 의해 달성됩니다.반복하다시스템 기능 계열. dup
은 약어이다복사예를 들어 이렇게 하면 다음과 같습니다.
3>&2
( ) 파일 설명자 2를 파일 설명자 3에 복사 dup2
하고, 파일 설명자 3( dup2(2,3)
)이 이미 열려 있으면 닫을 수 있습니다. 이는 fork
하위 프로세스를 종료할 때 발생하므로 상위 프로세스에는 아무 작업도 수행하지 않습니다. (셸에서의 리디렉션)은 일부 상황에서 작동하며, 셸에서는 마치 작동하는 것처럼 보이게 만듭니다)).
이 작업을 수행할 때:
1<someFile
이는 open
someFile
새 파일 설명자( open
일반적으로 시스템 호출이 수행하는 작업)에 있는 다음 dup2
해당 파일 설명자를 1( dup2(newfd,1)
)에 배치합니다.
복사된 대상 파일 설명자는 항상 왼쪽에 "&"가 없으며(재지정을 할당으로 생각하는 데 도움이 될 수 있으며 //left=right
의 혼란스러운 방향으로 인해 혼동되지 않을 수 있음) 오른쪽에 열려 있는 파일이 있습니다. 이름은 ( , 또는 여는 방법을 결정합니다 - 쓰기 및 생성 가능, 추가 및 생성 가능 또는 읽기 전용의 경우 잘림) 또는 오른쪽의 앰퍼샌드 뒤에 소스 파일 설명 기호가 옵니다(영향을 받지 않음) 또는)에 의해. 왼쪽이 생략되면 for 또는 for가 암시됩니다.<
>>
>
>
>>
<
>
>>
<
1
>
>>
0
<
매뉴얼에 따르면 나열된 특수 개발 파일 중 하나가 대체되면 someFile
쉘은 open
-on-a-new-fd 단계를 건너뛰고 대신 dup2
일치하는 파일 설명자로 직접 이동합니다(예: 1은 /dev/ stdout을 의미함). 등)을 대상으로(왼쪽의 파일 설명자를 리디렉션)
- 리디렉션 소스(RHS)인 /dev/stdin <=> &0
- 리디렉션 소스(RHS)인 /dev/stdout <=> &1
- 리디렉션 소스(RHS)인 /dev/stderr <=> &2
- 리디렉션 소스(RHS)인 /dev/fd/$somefd <=> &$somefd
답변2
파일 설명자는 커널의 전역 파일 테이블에 대한 포인터입니다(참조:https://www.computerhope.com/jargon/f/file-descriptor.htm예를 들어). 따라서 숫자(레이블이나 이름 역할을 함)와 값(실제 포인터)이 있습니다. 파일 설명자를 다른 파일 설명자로 복사하면 실제로 소스 파일 설명자에서 대상 파일 설명자로 포인터 값을 복사하는 것입니다.복사소스를 대상으로 변환합니다.
따라서 다음과 같이 선언하십시오.
> 리디렉션에 여러 파일 이름이 사용되는 경우 Bash는 다음 표에 설명된 대로 이러한 파일 이름을 독점적으로 처리합니다. [...]
/개발/강한
File descriptor 1 is duplicated
당신이 할 때 의미"n>/dev/stdout"(/dev/stdout으로 리디렉션하거나 /dev/stdout fd를 n fd로 복사), bash는 단순히 fd "1"을 복사합니다. 특수 파일이 아닌 일반 파일로 리디렉션하는 경우 bash는 새 파일 설명자를 생성하여 리디렉션하려는 파일 설명자에 복사합니다.