스크립트(stdin), stdout 및 stderr을 실행하는 데 사용되는 명령을 파일로 인쇄하는 간결한 방법

스크립트(stdin), stdout 및 stderr을 실행하는 데 사용되는 명령을 파일로 인쇄하는 간결한 방법

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

이는 쉘 스크립트이든 컴파일된 바이너리 실행 파일이든 모든 명령에 적용됩니다.

관련 정보