BASH 프로세스 교체가 일부 명령에서 작동하지 않는 이유는 무엇입니까?

BASH 프로세스 교체가 일부 명령에서 작동하지 않는 이유는 무엇입니까?

프로세스 교체가 예상대로 작동하지 않는 경우가 있습니다. 예는 다음과 같습니다.

입력하다:

gcc <(echo 'int main(){return 0;}')

산출:

/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status

입력하다:

그러나 다른 명령과 함께 사용하면 예상대로 작동합니다.

grep main <(echo 'int main(){return 0;}')

산출:

int main(){return 0;}

다른 명령에서도 유사한 오류가 발생하는 것을 발견했습니다(예: 프로세스 교체 시 파일을 기대하는 명령이 작동하지 않거나 /dev/fd/63이와 유사함). 이번 실패는 gcc최근의 실패입니다. 이러한 방식으로 프로세스 교체가 실패하고 사용해서는 안 되는 경우를 결정하기 위해 알아야 할 몇 가지 일반 규칙이 있습니까?

저는 Ubuntu 12.04에서 이 BASH 버전을 사용하고 있습니다(arch와 debian에서도 본 적이 있습니다):
GNU bash, 버전 4.3.11(1)-release (i686-pc-linux-gnu)

답변1

프로세스 교체는 명명된 파이프의 읽기 끝처럼 동작하는 특수 파일( /dev/fd/63예제와 같은)을 생성합니다. 파일을 열고 읽을 수는 있지만 쓰거나 검색할 수는 없습니다.

인수를 순수 스트림으로 처리하는 명령은 작동하지만, 주어진 파일에서 찾거나 쓰려는 명령은 작동하지 않습니다. 유효한 명령 유형은 일반적으로 필터 cat( , grep, sed, 등 gzip) 로 간주됩니다. awk잘못된 명령의 예로는 와 같은 편집기 vimv.

gcc입력 파일에 대해 임의 액세스를 수행하여 해당 파일이 작성된 언어를 감지할 수 있기를 원합니다. 입력 파일의 언어에 대한 힌트를 제공하면 gcc파일을 스트리밍할 것입니다 .

gcc -x c <(echo 'int main(){return 0;}')

프로시저 대체가 없는 더 간단하고 직접적인 형식도 작동합니다.

echo 'int main(){return 0;}' | gcc -x c -

bash프로세스 대체를 지원하는 모든 쉘은 동일한 방식으로 작동합니다 .

관련 정보