다음과 같은 스크립트를 고려해보세요.
echo a
echo b
echo c
3개의 라인이 생성됩니다. 이제 다음과 같이 실행할 수 있습니다.
abc_script | real_program
real_program
입력에 이 3개의 파일을 가져옵니다. 그러나 사용자에게는 문제가 있습니다. abc_script
출력을 real_program
.
그렇다면 이 리디렉션을 스크립트로 어떻게 이동합니까? 다음과 같은 것(스크립트):
echo a | echo b | echo c | real_program
이것은 작동하지 않습니다. 이것은 단지 제가 하고 싶은 일을 예시한 것일 뿐입니다. real_program
스크립트 내에서 호출을 숨기는 것입니다.
기록을 위해: 제 경우에는 입력이 일부 파일과 추가 줄로 구성됩니다. 그래서 나는 가지고있다:
cat $input_file
echo $extra_line
단지 a, b, c가 아닙니다.
답변1
이와 같이:
( echo a
echo b
echo c ) | real_program
서브셸에서 세 가지 명령을 실행 echo
하고 서브셸의 출력을 스크립트로 파이프합니다.
서브쉘은 구문 설탕입니다 bash -c 'echo a; echo b; echo c' | real_program
.
답변2
또 다른 방법은
echo -e "$(cat $input_file)\n$extra_line" | real_program
답변3
<()
세 번째 방법은 명령의 입력을 리디렉션하는 것입니다. 이는 최소한 GNU bash 4.2.37에서 작동하며 최신 bash 및 기타 쉘에서도 작동해야 합니다(일반 지원이 어떤지는 모르겠습니다).
$ echo hello > test
$ echo my > test
$ echo beautiful > test
$ cat <(cat test; echo world)
hello
my
beautiful
world
$
아이디어는 먼저 파일을 생성한 다음 cat
명령 시퀀스의 출력에서 시작하여 표준 입력을 리디렉션하는 것 입니다 cat test; echo world
. 출력에서 볼 수 있듯이 이 입력은 모든 입력 리디렉션 명령의 출력을 연결한 것입니다.
동일한 것을 표현하는 또 다른 방법(아마도 더 이식성이 높음)은 명령에 일반 하위 쉘 파이프로 간단히 다시 작성하는 것입니다.
(cat test; echo world) | cat
명령은 순차적으로 실행되지만 해당 출력은 외부 또는 다음 명령 입력에서 단일 스트림이 됩니다. 따라서 위 예의 외부 명령에는 cat
EOF 또는 이와 유사한 내용이 표시되지 않지만 내부 명령을 호출하는 데 비용이 많이 드는 경우 해당 비용을 여러 번 지불하게 됩니다. 이 문제를 해결할 방법이 있는지 의심스럽습니다.