Bash에서 스크립트를 실행하려고 합니다.cc.sh
Bash 스크립트를 실행합니다.
../cc.sh ../seq/ seqf
여기서 ../seq/
및 seqf
는 필수 매개변수입니다.
스크립트(위의 명령)를 실행하는 데 사용된 명령을 스크립트의 출력/결과와 함께 로그 파일에 저장하고 싶습니다.
명령을 사용하여 출력을 로그 파일로 인쇄했습니다 tee
.
../cc.sh ../seq/ seqf 2<&1 | tee -a cc.log
cat
참조 로그:
"here is where the output shown"
명령 자체의 경우 가장 가까운 명령은 명령이었습니다 script
. 그런데 실행하는데 사용하는 명령을 바이너리 파일로 저장하는 것 같습니다.
인쇄 명령 외에 더 좋은 방법이 있습니까 script
? 아니면 더 나은 방법은 스크립트 파일을 실행하는 데 사용된 명령을 출력/결과와 함께 로그 파일로 인쇄하는 것입니다.
로그 파일의 예상 출력:
COMMAND: ../cc.sh ../seq/ seqf
"here is where the output shown"
답변1
가장 쉬운 방법은 이름과 인수 목록을 표준 출력에 인쇄하도록 스크립트를 수정하는 것입니다. 예를 들어 스크립트 파일에 echo $0 $@
첫 번째 줄이 포함되어 있으면 필요한 정보가 인쇄됩니다(sh를 사용하고 bash에서 시작한다고 가정).
#!/bin/sh echo "$0 $@"
그런 다음 표준 출력을 파일, 티 또는 원하는 대로 리디렉션할 수 있습니다.
답변2
배열을 사용하여 명령과 해당 매개변수를 저장합니다. 명령(배열)을 출력 파일로 인쇄한 다음 명령을 실행합니다. 파이프를 통해 모든 출력을 파일 tee
에 추가합니다.cc.log
mycommand=( ../cc.sh ../seq/ seqf )
{
printf 'COMMAND: %s\n' "${mycommand[*]}"
"${mycommand[@]}"
} | tee -a cc.log
그러면 배열이 생성되고 mycommand
해당 요소가 명령과 매개변수로 설정됩니다. 그런 다음 문자열 접두사가 붙은 명령을 인쇄합니다 COMMAND:
. 확장자는 첫 번째 문자(보통 공백)로 "${mycommand[*]}"
구분된 배열 요소로 구성된 단일 문자열 입니다.$IFS
확장은 "${mycommand[@]}"
개별적으로 인용된 문자열, 즉 명령과 개별적으로 인용된 인수의 목록입니다. 이러한 확장을 사용하면 명령이 올바르게 호출됩니다.
두 명령의 출력은 동일한 복합 명령( )의 일부이기 때문에 하나씩 printf
함께 리디렉션됩니다 .tee
{...;}
또는 명명된 배열 대신 위치 인수 목록을 사용하세요.
set -- ../cc.sh ../seq/ seqf
{
printf 'COMMAND: %s\n' "$*"
"$@"
} | tee -a cc.log
이는 쉘 스크립트이든 컴파일된 바이너리 실행 파일이든 모든 명령에 적용됩니다.