파일에 stdout 및 stderr 추가

파일에 stdout 및 stderr 추가

나는 이것을 가지고있다:

nohup_ntrs(){
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")";
  echo " ------------- BEGIN $(date) -------------- " >> "$nohup_file"
  nohup "$@" &>> "$nohup_file"
  echo " ------------- END $(date) -------------- " >> "$nohup_file"
}

하지만 이 구문은 잘못되었습니다.

 nohup "$@" &>> "$nohup_file"

>> 연산자를 사용하여 추가하려고 하는데 표준 오류도 거기로 전송됩니다. 내 생각엔 이 작업을 수행하는 유일한 방법은 다음과 같습니다.

 nohup "$@" 2>&1 >> "$nohup_file"

이를 수행하는 더 깨끗한 방법이 있습니까?

답변1

&>>bash표준 출력 및 표준 오류 스트림을 연결된 스키마 파일로 리디렉션하는 셸의 올바른 구문입니다.

sh내 생각에 아마도 무슨 일이 일어나고 있는지는 시스템에서는 실행 스크립트가 아닌 실행 스크립트를 사용하고 있다는 것입니다 bash. 또는 bash처음으로 지원되는 버전 4.0 이전 버전을 실행하고 있습니다 &>>.

>>file 2>&1귀하의 경우에는 표준을 준수하는 또 다른 접근 방식을 사용하는 것입니다 .

nohup "$@" >>"$nohup_file" 2>&1

아니요더 짧게표준을 준수하는 쉘에서 이를 수행하는 방법 sh.

귀하의 제안은 2>&1 >>file표준 오류 스트림을 파일로 보내는 것이 아니라 표준 출력 스트림이 있는 곳으로 보내는 것입니다.처음에는가다. 리디렉션은 왼쪽에서 오른쪽으로 처리되므로당신의리디렉션은 먼저 표준 출력이 있는 곳으로 표준 오류를 보냅니다.그 다음에추가 모드에서 표준 출력을 파일로 리디렉션합니다. 즉, 두 번째 리디렉션은 >>file표준 오류가 가는 곳을 변경하지 않으므로 원래 표준 출력이 있었던 곳으로 이동합니다(이전 2>&1.


코드를 작성하는 또 다른 방법은 다음과 같습니다.

nohup_ntrs () {
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")"

  {
    printf ' ------------- BEGIN %s -------------- \n' "$(date)"
    nohup "$@"
    printf ' ------------- END %s ---------------- \n' "$(date)"
  } >>"$nohup_file" 2>&1
}

출력을 중괄호로 리디렉션해야 하는 명령을 그룹화하고 해당 명령을 리디렉션하여 단일 리디렉션으로의 리디렉션 수를 줄일 수 있습니다.복합 명령전체적으로.

답변2

nohup "$@" 2>&1 | tee "$nohup_file"

또는 스크립트에서 파일 설명자를 열고 exec둘 다 해당 설명자로 리디렉션할 수 있습니다.stdoutstderr

관련 정보