공정대체

Process substitution

컴퓨팅에서 프로세스 대체는 명령어의 입력이나 출력을 파일로 나타낼 수 있도록 하는 프로세스통신의 한 형태다.명령어는 일반적으로 파일 이름이 발생하는 인라인에서 명령 셸로 대체된다.이것은 보통 파일만 받아들이는 프로그램이 다른 프로그램에서 직접 읽거나 쓸 수 있게 해준다.

역사

프로세스 대체는 다음에 대한 컴파일 시간 옵션으로 사용 가능ksh88Bell Labs의 1988년 버전 KornShell.[1]rc shell은 1990년에 발매된 버전 10 Unix에서 "파이프라인 분기"로서의 기능을 제공한다.[2]바쉬 셸은 1994년에 출시된 버전 1.14 이전에 공정 대체를 제공했다.[3]

다음 예제는 KornShell 구문을 사용한다.

Unix diff 명령은 일반적으로 비교할 두 개의 파일 이름 또는 하나의 파일 이름과 표준 입력을 허용한다.프로세스 대체는 다음과 같은 두 프로그램의 출력을 직접 비교할 수 있게 한다.

$ diff <(file1) <(file2)

<(command)식은 명령 통역관에게 명령을 실행하고 그 출력을 파일로 표시하도록 지시한다.명령은 임의로 복잡한 셸 명령일 수 있다.

공정 대체 없이 대안은 다음과 같다.

  1. 명령의 출력을 임시 파일에 저장한 다음 임시 파일을 읽으십시오.
    $ sort file2 > /tmp/file2.1987$ sort file1 diff - /tmp/file2.1987$ rm/tmp/file2.107
  2. 명명파이프를 만들고(일명 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)

쉘이 수행하는 단계는 다음과 같다.

  1. 새 익명 파이프를 만드십시오.이 파이프는 다음과 같은 것으로 접근할 수 있을 것이다./dev/fd/63; 다음과 같은 명령으로 볼 수 있다.echo <(true).
  2. 백그라운드에서 대체된 명령 실행(sort file2이 경우), 출력물을 익명 파이프에 배관한다.
  3. 대체된 명령을 익명 파이프의 경로로 대체하여 기본 명령을 실행하십시오.이 경우 전체 명령은 다음과 같은 것으로 확장될 수 있다.diff file1 /dev/fd/63.
  4. 실행이 완료되면 익명 파이프를 닫으십시오.

명명된 파이프의 경우 실행은 파이프의 생성과 삭제에만 차이가 있다. 실행은 다음과 같이 생성된다.mkfifo(새 임시 파일 이름이 지정되고 다음 명령으로 제거됨)unlink. 다른 모든 측면은 그대로 유지된다.

제한 사항

작성된 "파일"은 검색할 수 없으며, 이는 해당 파일에 대한 읽기 또는 쓰기가 무작위 액세스를 수행할 수 없으므로 처음부터 끝까지 한 번 읽거나 써야 한다는 것을 의미한다.파일을 열기 전에 파일 형식을 명시적으로 확인하는 프로그램은 프로세스 대체에 따른 "파일"이 일반 파일이 아니기 때문에 프로세스 대체 작업을 거부할 수 있다.또한, Bash 4.4(2016년 9월 발표)까지, 공정 대체를 만든 쉘로부터 공정 대체 명령의 종료 코드를 얻을 수 없었다.[4]

참고 항목

참조

  1. ^ Rosenblatt, Bill; Robbins, Arnold (April 2002). "Appendix A.2". Learning the Korn Shell (2nd ed.). O'Reilly & Associates. ISBN 0-596-00195-9.
  2. ^ Duff, Tom (1990). Rc — A Shell for Plan 9 and UNIX Systems. CiteSeerX 10.1.1.41.3287.
  3. ^ Ramey, Chet (August 18, 1994). Bash 1.14 release notes. Free Software Foundation. 2016년 2월 12일 현재 버전 1.14.7의 Gnu 소스 아카이브에서 사용 가능.
  4. ^ "ProcessSubstitution". Greg's Wiki. 22 Sep 2016. Retrieved 2021-02-06.

추가 읽기