bash에서 "cat << EOF | grep"은 어떻게 작동하나요?

bash에서 "cat << EOF | grep"은 어떻게 작동하나요?

존재하다이 답변도착하다bash에서 "cat << EOF"는 어떻게 작동하나요?Stack Overflow에서 처음 두 점을 얻었습니다. 하지만 세 번째 요점은 이해가 안 돼요.Bash의 파이프에 여러 줄 문자열 전달

  1. Bash의 파이프에 여러 줄 문자열 전달

     $ cat <<EOF | grep 'b' | tee b.txt
     foo
     bar
     baz
     EOF
    

3개의 단어, 2개의 파이프 문자가 있기 때문입니다. 그러면 어떻게 설명해야 할지 모르겠습니다.

답변1

귀하의 의견으로 판단하면 다음과 같습니다.

첫 번째 파이프 문자("|")가 무엇을 하는지 잘 모르겠습니다.

첫 번째 |문자는 의 출력을 cat의 입력에 연결합니다 grep. <<리디렉션입력하다; 이는 와 유사하게 cat완전히 별개의 리디렉션입니다 .<cat <some_file | grep …

당신은 선호할 수도 있습니다<<EOF cat | grep 'b' | tee b.txt (비교이 답변) 왼쪽에서 오른쪽으로 읽으면 데이터 흐름 방식과 엄격하게 일치하기 때문입니다.여기 문서catgreptee.

이 모든 작업은 다음 없이 수행할 수 있습니다 cat.

<<EOF grep 'b' | tee b.txt
foo
bar
baz
EOF

(또는 grep 'b' <<EOF | …).

답변2

당신은 사용하고 << EOF있습니다트레독.

여러 줄 문자열은 임시 파일에 기록된 다음 다음과 같이 됩니다.표준 입력의 과정 /bin/cat. cat(즉, 여러 줄 문자열) 의 출력 은 로 파이프되고, grep이는 다시 로 파이프됩니다 tee.

답변3

heredoc 구문의 추가 예는 다음과 같습니다.

cat <<EOF1 | cat /proc/self/fd/3 - 3<<EOF2 | cat /proc/self/fd/3 - 3<<EOF3  
foo
EOF1
bar
EOF2
baz 
EOF3

산출

baz
bar
foo

처음에는 구분 문서가 리디렉션된 직후에 구분 문서가 제공되어야 한다고 생각할 수도 있지만 사실은 그렇지 않습니다. 계속해서 명령을 작성할 수 있으며 추가 heredoc 리디렉션을 제공할 수도 있습니다. 이는 잠재적으로 긴 heredoc 후에 명령을 분할하도록 강제하는 리디렉션 없이 명령을 한 곳에 유지할 수 있음을 의미합니다.

답변4

catcat | grep체인에 중복성이 있습니다. 이는 뉴비들이 다른 뉴비들을 복사해서 붙여넣는 증상입니다.

grep(또는 다른 도구)는 다음 사항 없이도 입력을 정상적으로 받아들일 수 있습니다 cat.

grep PATT <<EOF
...
EOF

셸 구문을 사용하면 명령 앞이나 뒤에 IO 리디렉션을 지정할 수 있습니다.

<<EOF grep OK - <(echo "OK 2")
OK 1
EOF

다음을 인쇄합니다( 로 지정된 HERE 문서에서 stdin을 검색한 -다음 으로 지정된 프로세스 대체에서 명명된 파이프를 검색 <()).

(standard input):OK 1
/dev/fd/63:OK 2

원하는 만큼 HERE 문서를 가질 수 있습니다. 데이터를 다른 파일 설명자로 전달하고 최신 "win"에 대한 리디렉션을 복사하세요(아래 인쇄 OK3).

<<EOF1 <<EOF2 cat <<EOF3
OK1
EOF1
OK2
EOF2
OK3
EOF3

스트림 3을 열고 데이터를 쓰고 나중에 읽는 예( 설명자를 설명자로 <&N리디렉션하는 구문 , 즉 ):N0stdin

exec 3<<EOF
> OK
> EOF

cat <&3
OK

proc프로세스의 파일 설명자는 파일 시스템을 통해 참조될 수 있습니다 ( 프로세스를 포크할 때 무엇이 ​​사용되는지 /proc/self/fd/N이해해야 합니다 !).self

<<EOF cat | cat - /proc/self/fd/3 3<<EOF3 | cat - /proc/self/fd/4 4<<EOF4
> OK 1
> EOF
> OK 2
> EOF3
> OK 3
> EOF4
OK 1
OK 2
OK 3

관련 정보