질문
파이프가 실제로 존재할 때 파이프 로 리디렉션하기 위해 쉘이 <<<
, 및 와 같은 < <(command)
대안 을 구현하는 이유는 무엇입니까?< /dev/fd/*
stdin
예
방식 |
(클래식 파이프라인)
echo 'text' | sed 's/x/y/'
# or
cat - | sed 's/x/y/' # type text afterwards
<<<
도로
sed 's/x/y/' <<< 'text'
< <(command)
도로
sed 's/x/y/' < <(echo 'text')
# while <(command) becomes a file descriptor like
sed 's/x/y/' < /dev/fd/42
모두 돌아오세요 teyt
.
답변1
소토는 주로 미학적 이유에 관심을 두었지만 기술적인 이유도 있었습니다. 예를 들어 파이프라인은 오른쪽에 하위 프로세스를 생성하는 경우가 많습니다. 즉, 나중에 사용하려는 상태나 변수를 설정할 수 없다는 의미입니다. 비교하다:
$ echo foo > file
$ line=bar; cat file | read -r line; echo "$line"
bar
$ line=bar; read -r line < file; echo "$line"
foo
답변2
파이프는 공정에서 공급되어야 하기 때문입니다. 리디렉션에는 <
프로세스가 필요하지 않으며 파일로 제공될 수 있습니다. 리디렉션 <
도 오래 전에 생성되었으며 <<<
작업 이 발명되었습니다.<( ...)
>
출력 방향 재지정에 대한 보완(대응) 이기도 합니다 . 서로를 보완하는 기본 기능을 갖는 것은 좋은 일입니다.
답변3
파일에서 입력을 리디렉션하는 경우 효율성(Sotto Voce가 지적한 program <file
대로 cat file | program
) 외에도 프로그램이 파일에 직접 액세스할 수 있으므로 파일을 처음부터 끝까지 읽는 것 이외의 작업을 수행할 수 있습니다. . 몇 가지 예:
파일에서 잘못된 순서로 읽을 수 있습니다. 를 사용하면
cat hugefile | tail
프로그램tail
은 끝까지 도달하기 위해 전체 파일을 읽어야 하지만, 을 사용하면 파일 끝 부분으로 점프하여 원하는 내용을 얻을 때까지 뒤로 읽을tail <hugefile
수 있습니다 .lseek()
문제를 일으키지 않고 파일의 일부만 읽을 수 있습니다. 를 사용하면
head <hugefile
필요한head
내용을 읽은 다음 종료합니다(파일이 닫힙니다). 그러나 를 사용하면 파이프를 종료하고 닫을cat hugefile | head
때 여전히 목적지가 없는 파이프로 데이터를 밀어넣으려고 시도하게 됩니다. 이 문제를 해결하기 위해 시스템은 에 신호를 보냅니다 . 많은 프로그램은 를 가져올 때 오류 메시지를 인쇄합니다 . 제가 테스트한 버전에서는 이를 수행하지 않았지만 오류 상태로 종료되었습니다. 이것이 설정 및 모드 스크립트 에 있는 경우 (예:head
cat
SIGPIPE
cat
SIGPIPE
cat
-e
pipefail
"비공식 Bash 엄격 모드"), bash는 이를 치명적인 오류로 처리하고 스크립트를 종료합니다. (이런 종류는 추천하지 않습니다set -e
.)파일의 속성에 액세스할 수 있습니다. 를 사용하는 경우
pv <hugefile | slowprocessor
(pv
"파이프라인 뷰어" 유틸리티)는 파일 크기를 확인하고 지금까지 전송된 파일의 비율과 예상 완료 시간을 보여주는 진행률 표시줄을 제공합니다. 하지만 만약cat hugefile | pv | slowprocessor
당신이pv
사용한다면 (참고: 실제로 파일의 크기를 명시적으로 알려주는 옵션이pv
있습니다 .)-s
따라서 전반적으로 입력 파일에 대한 직접 액세스는 프로그램이 파일을 사용하는 방식에 있어 더 많은 유연성을 제공합니다.
또한 많은 프로그램(여기서 예제로 사용하는 모든 프로그램 포함)을 사용하면 입력 파일을 명령 인수로 직접 지정할 수 있습니다(예: 또는 tail hugefile
대신 ). 이는 프로그램을 허용합니다.tail <hugefile
cat hugefile | tail
심지어정보를 제공하고 파일에 액세스하는 방법을 제어합니다. 또한 (이 기능을 지원하는 명령의 경우에도) 여러 입력 파일을 허용합니다 cat |
. 따라서 일반적으로 이를 지원하는 명령에 대한 파이프나 입력 리디렉션보다 선호됩니다.