명령에서 원래 명령을 포함하여 파일로 직접 출력하고 터미널에서 인쇄 출력을 지정된

일부 테스트를 실행할 때 일련의 명령을 실행해야합니다. 이 모든 것을 할 수있는 방법이 있다면 나에게 매우 유용하고 많은 시간을 절약 할 수 있습니다.

  • 실행할 명령을 실행하십시오.
  • 명령의 모든 출력을 지정된 파일로 경로 재 지정
  • 지정된 파일에 원래 명령을 포함
  • 터미널에서 원래 명령의 출력을 인쇄하십시오.

사람들은 나에게 티를 사용하여 터미널로 인쇄하고 파일로 보내는 작업은 훌륭하지만 원래 명령은 포함하지 않는 것이 좋습니다. 내가 끝내고 싶은 것은 첫 번째 줄이 내가 실행 한 명령이고 그 아래에 명령의 출력이있는 파일입니다.

누군가 이것을 제안했습니다.

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

그러나 이것은 터미널에서 출력을 인쇄하거나 파일에 원래 명령을 포함하지 않습니다.

어떤 아이디어라도 감사합니다.



답변

그건 tee당신을 위해있는 거 검색.

ls -l | tee outfile

출력 ls -l을 stdout (예 : 터미널)에 인쇄하고 outfile동시에 파일 에 저장합니다 . 그러나 : 명령 이름을 표준 출력이나 파일에 쓰지 않습니다. 이를 위해서는 echo명령을 실행하기 전에 명령 이름 만 사용 하고 두 출력을 모두 다음으로 파이프하십시오 tee.

( echo "ls -l" && ls -l ) | tee outfile

입력하기가 번거롭기 때문에 왜 함수를 정의하지 않습니까?

both(){ ( echo "$@" && "$@" ) | tee outfile ;}

그 후 당신은 그냥 실행할 수 있습니다

both ls -l

원하는 결과를 얻을 수 있습니다. ~/.bashrc모든 새 터미널에서 정의되도록 함수를 넣으십시오 .

다음과 같이 출력 파일을 첫 번째 인수로 지정하려면

both output ls -l

대신 확인하십시오 :

both(){ ( echo "${@:2}" && "${@:2}" ) | tee "$1" ;}

출력 파일을 덮어 쓰지 않고 파일에 추가하려면 -a옵션을에 추가하십시오 tee.


답변

당신은 script당신의 터미널에 인쇄 된 모든 것들의 타입 스크립트 파일을 만드는 명령을 사용할 수 있습니다 . 갈래 껍질을 만들고 껍질이 나올 때까지 모든 것을 기록합니다.

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

그런 다음 cat my_output동일한 출력을 얻으면 :

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC

답변

쉘의 디버깅 기능을 다음과 함께 사용할 수 있습니다 tee.

( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... )서브 쉘 내에서 실행되는 모든 명령의 출력 스트림을 “수집”할 수있는 서브 쉘을 시작합니다. 또한 set이 하위 쉘 에 대한 아래 명령 의 효과도 포함합니다 .

  • set -xx쉘이 실행하기 전에 쉘이 실행하는 모든 명령을 표준 오류 스트림으로 인쇄 하는 쉘 옵션을 활성화 합니다.

  • 2>&1 스트림 2 (표준 오류)를 스트림 1 (표준 출력)로 리디렉션합니다.

  • | 왼쪽 명령의 표준 출력 스트림을 오른쪽 명령의 표준 입력 스트림으로 리디렉션합니다.

  • tee FILE표준 입력 스트림을 파일 FILE및 표준 출력에 복사합니다 .

명령 시퀀스가 ​​이미 스크립트 파일에 있으면 다음과 같이 실행하는 것이 더 합리적입니다.

bash -x /path/to/script args... 2>&1 | tee output.log

답변