리디렉션된 명령 자체를 출력 파일 리디렉션에 어떻게 포함할 수 있나요? 예를 들어
echo "hello!">output.txt
내가 원하는 출력 파일의 내용은 다음과 같습니다.
echo "hello!">output.txt
hello!
답변1
여기에는 두 가지 중 하나가 필요할 수 있습니다.
사용
tee
echo
터미널과 파일로 전송된 결과를 가져옵니다.$ echo 'hello!' | tee output hello! $ cat output hello!
script
전체 터미널 세션을 캡처 하려면 :$ script Script started, output file is typescript $ echo 'hello!' >output $ cat output hello! $ exit Script done, output file is typescript
$ cat typescript Script started on Sat Nov 10 15:15:06 2018 $ echo 'hello!' >output $ cat output hello! $ exit Script done on Sat Nov 10 15:15:37 2018
이것이 귀하가 요청한 것이 아니라면 질문을 명확히 해주세요.
답변2
귀하가 요구하는 내용의 일반적으로는 불가능합니다.
다른 도구((1)과 유사)를 사용하여 이를 달성하려면 script
프로그램이 쉘을 관찰해야 합니다.
command >foo
foo
파일 이름을 입력한 다음 생성합니다. 또한 셸이 이를 생성하려고 시도하므로 이미 충돌이 발생했습니다. 또한, 프로그램이 인쇄된다면 어떻게 될까요?
command >foo
터미널로?
셸 내부에서 셸의 리디렉션 프로세스는 프로그래밍 관점에서 볼 때 매우 원시적입니다(원본 셸을 직접 만든 C 강의를 찾아보면 정말 놀랍습니다).
이 기능이 정말로 필요한 경우 자체 셸을 해킹하여 리디렉션을 가로채고 명령을 대상 파일에 전달해야 합니다. 하지만 세부적인 부분에는 불쾌한 문제가 많이 있을 수 있습니다.
답변3
전체 셸을 파이프할 수도 있습니다.
$ sh -i |& tee sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit
-i
stdout은 터미널은 아니지만 쉘을 대화형으로 유지하는 것은 여전히 필요합니다. bash와 zsh도 이 옵션을 지원합니다. |&
파이프 stdout 및 stderr; zsh 및 bash에서는 작동하지만 sh(필요한 경우 2>&1 |
)에서는 작동하지 않습니다. 물론, 파일로 리디렉션하고 싶은 경우에는 &>
또는 를 사용할 수도 있습니다. 2>&1 >
어쨌든 sh.log
여기에는 모든 것이 포함되어 있습니다.
$ cat sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit
답변4
출력 파일 이름을 제거해도 괜찮다면 다음이 가장 쉬운 방법이라고 생각합니다.
command='echo "hello!"'
(echo "$command"; eval "$command") >output.txt
그러나 파일 이름을 인쇄해야 하는 경우 다음 명령을 사용할 수 있습니다.
command='echo "hello!"'
(echo "$command >output.txt"; eval "$command") >output.txt
파일 이름에 대한 변수를 도입하여 두 파일 이름이 모두 동일한지 확인할 수 있습니다.
output="output.txt"
command='echo "hello!"'
(echo "$command >$output"; eval "$command") >$output
이렇게 하면 인쇄된 파일 이름이 실제 파일 이름과 다를 위험을 피할 수 있습니다.