here-documents 및 cat에서 출력 리디렉션을 사용하는 방법은 무엇입니까?

here-documents 및 cat에서 출력 리디렉션을 사용하는 방법은 무엇입니까?

다른 명령으로 파이프하거나 파일로 리디렉션하려는 스크립트가 있다고 가정해 보겠습니다( sh예제에서는 파이프로 연결). 내가 bash를 사용하고 있다고 가정 해 봅시다.

나는 사용할 수 있습니다 echo:

echo "touch somefile
echo foo > somefile" | sh

다음을 사용하여 거의 동일한 작업을 수행할 수도 있습니다 cat.

cat << EOF
touch somefile
echo foo > somefile
EOF

그러나 "EOF"를 "EOF|sh"로 바꾸면 그것이 heredoc의 일부라고 생각합니다.

cat표준 입력에서 텍스트를 출력한 다음 임의의 위치로 파이프하려면 어떻게 해야 합니까 ?

답변1

이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 것은 다음과 같습니다.

cat <<EOF | sh
touch somefile
echo foo > somefile
EOF

내 생각에 더 나은 구문인 또 다른 하나는 다음과 같습니다.

(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh

이 방법도 작동하지만 서브셸이 없어도 작동합니다.

{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh

추가 변경사항:

cat <<EOF |
touch somefile
echo foo > somefile
EOF
  sh

또는:

{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF

cat그런데, 귀하의 질문에 다른 내용에 대한 자리 표시자를 사용하고 있기를 바랍니다 . 그렇지 않은 경우 다음과 같이 제거하십시오.

sh <<EOF
touch somefile
echo foo > somefile
EOF

다음과 같이 단순화할 수 있습니다.

sh -c 'touch somefile; echo foo > somefile'

또는:

sh -c 'touch somefile
echo foo > somefile'

파이프 대신 출력 리디렉션

sh >out <<EOF
touch somefile
echo foo > somefile
EOF

cat다음과 동등한 결과를 얻으려면 사용하십시오 echo test > out.

cat >out <<EOF
test
EOF

여기에 여러 문서가 있습니다

( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2

그러면 다음과 같은 출력이 생성됩니다.

hi
---
there

일어나는 일은 다음과 같습니다.

  • ( ... )쉘은 서브쉘에 포함된 명령을 보고 실행합니다.
  • cat과 echo는 간단합니다. fd 3에서 리디렉션된 파일 설명자(fd) 0(stdin)을 사용하여 cat을 실행하는 것을 의미합니다 cat <&3. 즉, fd 3에서 입력을 제거합니다.
  • 시작하기 전에 (...)쉘은 이 두 문서 리디렉션을 확인하고 fd 0( <<EOF) 및 fd 3( )을 파이프의 읽기 끝으로 바꿉니다.3<<EOF2
  • 초기 명령이 시작되면 쉘은 EOF에 도달할 때까지 표준 입력을 읽고 이를 첫 번째 파이프의 쓰기 끝으로 보냅니다.
  • 다음으로 EOF2와 두 번째 파이프의 쓰기 측면에 대해 동일한 작업을 수행합니다.

답변2

meow나는 단지 using 이 잘 작동한다는 점을 지적하고 싶었습니다 EOF.

Meow!스크립트는 다음 이름의 파일에 추가됩니다 cat.

#!/bin/sh
cat <<meow>> cat
Meow!
meow

다음을 사용하여 다른 이름으로 저장 cats하고 chmod +x cats실행 가능 하게 만듭니다 ./cats.

$ ./cats
$ cat cat
Meow!
$ ./cats
$ cat cat
Meow!
Meow!

설명하다:

  • cat <<meow~이다여기 문서통사론. 이는 문자열을 만날 때까지 줄 뒤의 텍스트 블록을 선택하도록 스크립트에 지시합니다 meow. 그러면 콘텐츠가 출력(또는 파이프)됩니다.
  • >> cat.라는 파일로 파이프됩니다 cat.
  • >대신 사용하면 >>파일을 추가하는 대신 덮어씁니다.
  • Meow!내용은여기 문서.
  • meow닫는 태그입니다여기 문서. 를 사용하여 콘텐츠를 >>에 첨부합니다 cat.

표준 출력 및 파일로 파이프됩니다.

요청한 파이프라인을 완료하려면 아니요여기 문서필요합니다.

cat텍스트를 출력하고 동시에 텍스트를 전달할 수는 없지만 tee정확히 원하는 작업을 수행합니다.

echo echo | tee tee

그러면 문자열이 출력되고 이름이 로 echo기록됩니다 .echotee

cat이것이 요구 사항의 일부인 경우 다음을 통해 출력을 전달할 수도 있습니다.

echo echo | tee tee | cat </dev/stdin

그렇지 않으면:

echo echo | tee tee | cat

문서 내용:

$ cat tee
echo

답변3

파이프를 통해 요소 목록을 루프로 실행해야 할 때 유용할 변형을 추가하고 싶습니다 while.

cat <<EOF | while read -r FOO; do
bar
baz
quux
EOF

echo $FOO

done

고양이 없이도 쓸 수 있어요

while read -r FOO; do
  echo $FOO
done <<EOF
bar
baz
quux
EOF

관련 정보