일부 테스트를 실행할 때 일련의 명령을 실행해야합니다. 이 모든 것을 할 수있는 방법이 있다면 나에게 매우 유용하고 많은 시간을 절약 할 수 있습니다.
- 실행할 명령을 실행하십시오.
- 명령의 모든 출력을 지정된 파일로 경로 재 지정
- 지정된 파일에 원래 명령을 포함
- 터미널에서 원래 명령의 출력을 인쇄하십시오.
사람들은 나에게 티를 사용하여 터미널로 인쇄하고 파일로 보내는 작업은 훌륭하지만 원래 명령은 포함하지 않는 것이 좋습니다. 내가 끝내고 싶은 것은 첫 번째 줄이 내가 실행 한 명령이고 그 아래에 명령의 출력이있는 파일입니다.
누군가 이것을 제안했습니다.
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 -x
x
쉘이 실행하기 전에 쉘이 실행하는 모든 명령을 표준 오류 스트림으로 인쇄 하는 쉘 옵션을 활성화 합니다. -
2>&1
스트림 2 (표준 오류)를 스트림 1 (표준 출력)로 리디렉션합니다. -
|
왼쪽 명령의 표준 출력 스트림을 오른쪽 명령의 표준 입력 스트림으로 리디렉션합니다. -
tee FILE
표준 입력 스트림을 파일FILE
및 표준 출력에 복사합니다 .
명령 시퀀스가 이미 스크립트 파일에 있으면 다음과 같이 실행하는 것이 더 합리적입니다.
bash -x /path/to/script args... 2>&1 | tee output.log