수색…
비고
프로세스 대체는 프로세스의 입력 또는 출력 (일부 명령 순서)이 임시 파일로 나타나는 리디렉션의 한 형태입니다.
웹에서 두 파일 비교
다음은 임시 파일을 작성하는 대신 프로세스 대체를 사용하여 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.txt
가 header.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
변수 값을 유지합니다.