현재 프롬프트 줄을 포함하는 파일로 리디렉션

현재 프롬프트 줄을 포함하는 파일로 리디렉션

리디렉션된 명령 자체를 출력 파일 리디렉션에 어떻게 포함할 수 있나요? 예를 들어

echo "hello!">output.txt

내가 원하는 출력 파일의 내용은 다음과 같습니다.

echo "hello!">output.txt
hello!

답변1

여기에는 두 가지 중 하나가 필요할 수 있습니다.

  1. 사용teeecho터미널과 파일로 전송된 결과를 가져옵니다.

    $ echo 'hello!' | tee output
    hello!
    $ cat output
    hello!
    
  2. 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

-istdout은 터미널은 아니지만 쉘을 대화형으로 유지하는 것은 여전히 ​​필요합니다. 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

이렇게 하면 인쇄된 파일 이름이 실제 파일 이름과 다를 위험을 피할 수 있습니다.

관련 정보