다른 명령으로 파이프하거나 파일로 리디렉션하려는 스크립트가 있다고 가정해 보겠습니다( 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
기록됩니다 .echo
tee
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