공정대체
Process substitution컴퓨팅에서 프로세스 대체는 명령어의 입력이나 출력을 파일로 나타낼 수 있도록 하는 프로세스 간 통신의 한 형태다.명령어는 일반적으로 파일 이름이 발생하는 인라인에서 명령 셸로 대체된다.이것은 보통 파일만 받아들이는 프로그램이 다른 프로그램에서 직접 읽거나 쓸 수 있게 해준다.
역사
프로세스 대체는 다음에 대한 컴파일 시간 옵션으로 사용 가능ksh88
Bell Labs의 1988년 버전 KornShell.[1]rc shell은 1990년에 발매된 버전 10 Unix에서 "파이프라인 분기"로서의 기능을 제공한다.[2]바쉬 셸은 1994년에 출시된 버전 1.14 이전에 공정 대체를 제공했다.[3]
예
다음 예제는 KornShell 구문을 사용한다.
Unix diff 명령은 일반적으로 비교할 두 개의 파일 이름 또는 하나의 파일 이름과 표준 입력을 허용한다.프로세스 대체는 다음과 같은 두 프로그램의 출력을 직접 비교할 수 있게 한다.
$ diff <(file1) <(file2)
그<(command)
식은 명령 통역관에게 명령을 실행하고 그 출력을 파일로 표시하도록 지시한다.명령은 임의로 복잡한 셸 명령일 수 있다.
공정 대체 없이 대안은 다음과 같다.
- 명령의 출력을 임시 파일에 저장한 다음 임시 파일을 읽으십시오.
$ sort file2 > /tmp/file2.1987$ sort file1 diff - /tmp/file2.1987$ rm/tmp/file2.107
- 명명된 파이프를 만들고(일명 FIFO라고도 함) 백그라운드에서 명명된 파이프에 명령어 쓰기를 시작한 다음 명명된 파이프를 입력으로 사용하여 다른 명령을 실행하십시오.
$mkiffo /tmp/sort2.fifo $ sort file2 > /tmp/siffo & $ sort file1 diff - /tmp/siff2.fo $ rm /tmp/siff2.fo
두 가지 대안 모두 더 번거롭다.
프로세스 대체는 또한 일반적으로 파일로 전달되는 출력을 캡처하고 프로세스의 입력으로 리디렉션하는 데 사용될 수 있다.프로세스에 쓰기 위한 Bash 구문은>(command)
여기 사용 예제가 있다.tee
,wc
그리고gzip
파일에서 행을 카운트하는 명령:wc -l
로 압축한다.gzip
일거에:
$ tee > (wc -l >&2) < 빅파일 gzip > 빅파일.gz
이점
공정 대체가 대안보다 더 큰 장점은 다음과 같다.
- 단순성:명령은 인라인으로 지정할 수 있다. 임시 파일을 저장하거나 명명된 파이프를 먼저 만들 필요가 없다.
- 성능: 다른 프로세스에서 직접 읽는 것이 임시 파일을 디스크에 쓴 다음 다시 읽어 들이는 것보다 더 빠른 경우가 많다.이렇게 하면 디스크 공간도 절약된다.
- 병렬 처리:교체된 프로세스는 다중 처리의 이점을 활용하여 계산의 총 시간을 줄이기 위해 출력 읽기 또는 입력 쓰기 명령과 동시에 실행될 수 있다.
메커니즘
후드 아래에서 공정 치환에는 두 가지 구현이 있다.지원하는 시스템/dev/fd
(대부분의 유닉스 유사 시스템) 를 호출하여 작동한다.pipe()
파일 설명자를 반환하는 시스템 호출$fd
새 익명 파이프에 대한 다음 문자열 생성/dev/fd/$fd
명령행에 있는 것을 대체한다.시스템이 없는 경우/dev/fd
지원을 요청한다.mkfifo
명명된 파이프를 만들고 명령줄에서 이 파일 이름을 대체하는 새 임시 파일 이름을 사용하십시오.관련 단계를 설명하려면 다음 명령 대체를 사용하십시오./dev/fd
지원:
$ diff file1 <(file2)
쉘이 수행하는 단계는 다음과 같다.
- 새 익명 파이프를 만드십시오.이 파이프는 다음과 같은 것으로 접근할 수 있을 것이다.
/dev/fd/63
; 다음과 같은 명령으로 볼 수 있다.echo <(true)
. - 백그라운드에서 대체된 명령 실행(
sort file2
이 경우), 출력물을 익명 파이프에 배관한다. - 대체된 명령을 익명 파이프의 경로로 대체하여 기본 명령을 실행하십시오.이 경우 전체 명령은 다음과 같은 것으로 확장될 수 있다.
diff file1 /dev/fd/63
. - 실행이 완료되면 익명 파이프를 닫으십시오.
명명된 파이프의 경우 실행은 파이프의 생성과 삭제에만 차이가 있다. 실행은 다음과 같이 생성된다.mkfifo
(새 임시 파일 이름이 지정되고 다음 명령으로 제거됨)unlink
. 다른 모든 측면은 그대로 유지된다.
제한 사항
작성된 "파일"은 검색할 수 없으며, 이는 해당 파일에 대한 읽기 또는 쓰기가 무작위 액세스를 수행할 수 없으므로 처음부터 끝까지 한 번 읽거나 써야 한다는 것을 의미한다.파일을 열기 전에 파일 형식을 명시적으로 확인하는 프로그램은 프로세스 대체에 따른 "파일"이 일반 파일이 아니기 때문에 프로세스 대체 작업을 거부할 수 있다.또한, Bash 4.4(2016년 9월 발표)까지, 공정 대체를 만든 쉘로부터 공정 대체 명령의 종료 코드를 얻을 수 없었다.[4]
참고 항목
참조
- ^ Rosenblatt, Bill; Robbins, Arnold (April 2002). "Appendix A.2". Learning the Korn Shell (2nd ed.). O'Reilly & Associates. ISBN 0-596-00195-9.
- ^ Duff, Tom (1990). Rc — A Shell for Plan 9 and UNIX Systems. CiteSeerX 10.1.1.41.3287.
- ^ Ramey, Chet (August 18, 1994). Bash 1.14 release notes. Free Software Foundation. 2016년 2월 12일 현재 버전 1.14.7의 Gnu 소스 아카이브에서 사용 가능.
- ^ "ProcessSubstitution". Greg's Wiki. 22 Sep 2016. Retrieved 2021-02-06.
추가 읽기
- "Bash Reference Manual". The GNU Project. Free Software Foundation. 23 December 2009. Retrieved 1 Oct 2011.
- Cooper, Mendel (30 Aug 2011). "Advanced Bash-Scripting Guide". The Linux Documentation Project. Retrieved 1 Oct 2011.
- Frazier, Mitch (22 May 2008). "Bash Process Substitution". Linux Journal. Retrieved 1 Oct 2011.