수색…


비고

프로세스 대체는 프로세스의 입력 또는 출력 (일부 명령 순서)이 임시 파일로 나타나는 리디렉션의 한 형태입니다.

웹에서 두 파일 비교

다음은 임시 파일을 작성하는 대신 프로세스 대체를 사용하여 diff 와 두 파일을 diff 합니다.

diff <(curl http://www.example.com/page1) <(curl http://www.example.com/page2)

명령 출력으로 while 루프에 피드하기

이렇게하면 grep 명령의 출력으로 while 루프가 실행됩니다.

while IFS=":" read -r user _
do
    # "$user" holds the username in /etc/passwd
done < <(grep "hello" /etc/passwd)

붙여 넣기 명령 사용

# Process substitution with paste command is common
# To compare the contents of two directories
paste <( ls /path/to/directory1 ) <( ls /path/to/directory1 )

파일 연결하기

동일한 명령에서 입력 및 출력에 동일한 파일을 사용할 수 없다는 것은 잘 알려져 있습니다. 예를 들어,

$ cat header.txt body.txt >body.txt

네가 원하는 걸하지 않는다. cat body.txt 읽을 때까지 이미 리다이렉션에 의해 잘려 body.txt 비어 있습니다. 최종 결과는 body.txtheader.txt 의 내용 보유 body.txt입니다.

프로세스 대체로이를 피하는 것이 좋습니다. 즉, 명령이

$ cat header.txt <(cat body.txt) > body.txt

body.txt 의 원본 내용을 body.txt 로 리디렉션에 의해 파일이 잘 body.txt 전에 어딘가에 일부 버퍼에 저장합니다. 작동하지 않습니다. 괄호 안의 cat 는 외부 파일처럼 모든 파일 기술자가 설정된 후에 파일 읽기를 시작합니다. 이 경우 프로세스 대체를 사용하려고 시도 할 필요는 없습니다.

파일을 다른 파일 앞에 추가하는 유일한 방법은 중간 파일을 만드는 것입니다.

$ cat header.txt body.txt >body.txt.new
$ mv body.txt.new body.txt

이것은 sed 또는 perl 이나 유사한 프로그램이 편집 옵션 (보통 -i )을 사용하여 호출 할 때 카펫 아래에서 수행하는 작업 입니다.

한 번에 여러 프로그램을 통해 파일 스트리밍

큰 파일에서 wc -l 을 사용하여 줄 수를 계산하는 동시에 gzip 압축합니다. 둘 다 동시에 실행됩니다.

tee >(wc -l >&2) < bigfile | gzip > bigfile.gz

일반적으로 tee 는 하나 이상의 파일 (및 표준 출력)에 입력을 씁니다. 우리는 tee >(command) 사용하여 파일 대신 명령에 쓸 수 있습니다.

여기서 wc -l >&2 명령은 tee 에서 읽은 행을 계산합니다 (차례대로 bigfile 에서 읽음). ( gzip 대한 입력과 섞이지 않도록 줄 수는 stderr ( >&2 )로 보내집니다.) tee 의 stdout은 동시에 gzip 공급됩니다.

하위 셸 사용을 방지하려면

프로세스 대체의 한 가지 중요한 점은 쉘에서 명령을 파이프 할 때 하위 쉘 사용을 피할 수 있다는 것입니다.

아래의 간단한 예를 통해이를 증명할 수 있습니다. 현재 폴더에 다음 파일이 있습니다.

$ find . -maxdepth 1 -type f -print
foo bar zoo foobar foozoo barzoo 

다음과 같이 카운터를 증가시키는 while / read 루프로 파이프하면 :

count=0
find . -maxdepth 1 -type f -print | while IFS= read -r _; do
    ((count++))
done

$count 는 하위 쉘 컨텍스트에서 수정 되었기 때문에 6 포함하지 않습니다 . 아래에 표시된 명령은 하위 셸 컨텍스트에서 실행되며 하위 셸이 종료 된 후에는 내부에서 사용되는 변수의 범위가 손실됩니다.

command &
command | command 
( command )

프로세스 대체 파이프를 사용하여 피함으로써 문제를 해결할 수 | 운영자

count=0
while IFS= read -r _; do
    ((count++))
done < <(find . -maxdepth 1 -type f -print)

하위 셸이 호출되지 않으므로 count 변수 값을 유지합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow