스크립트 호출자에게 추가 설명자를 제공합니다.

스크립트 호출자에게 추가 설명자를 제공합니다.

내 스크립트는 많은 원격 호출을 수행하고 긴 작업의 진행 상황을 화면에 STDOUT으로 출력합니다. 나는 현재 STDOUT 및 STDERR을 오염시키는 것을 원하지 않기 때문에 원격 호출에서 모든 STDOUT 및 STDERR을 숨깁니다.

"ssh"를 사용하여 원격 호출에서 로깅을 허용하거나 내 스크립트를 호출하는 모든 사람에 대해 STDOUT 및 STDERR을 리디렉션하려면 어떻게 해야 합니까? 파일 설명자에 대해 들어본 적이 있지만 구현 방법을 이해할 수 없는 것 같습니다.

파일 설명자에 대한 게시물을 많이 보았지만 이와 같은 출력을 제공하거나 리디렉션하는 게시물은 없었기 때문에 약간 당황했습니다!


편집 #1

이제 이전에 설정한 변수를 기반으로 원격 호출을 수행하는 코드가 생겼습니다. 다음을 수행하면:

remoteCall() {

    (
        command exec 1>&3
        command exec 2>&4
        ${remoteCommand} $@
    ) &> /dev/null

}

3/4를 1/2로 리디렉션하지 않는 한 원격 호출의 출력과 오류를 숨겨야 합니다. 따라서 누군가 내 스크립트를 큰 계획(이 예보다 훨씬 더 큰)으로 호출하면 STDOUT 또는 STDERR에 에코하는 내용을 제외하고는 화면에 출력되는 내용이 전혀 표시되지 않습니다.

이 예와 같이 RemoteCall의 STDOUT을 사용하려면 다음을 수행하십시오.

result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l")

꼭 이 일을 해야 하나요?

result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l" 3>1)

결과에 행 수가 포함됩니까?

답변1

스크립트에서 이 작업을 수행하는 경우:

ssh host cmd >&3 2>&4

그러면 스크립트를 호출하는 사람은 누구나 다음을 수행할 수 있습니다.

your-script > output 2> error 3> remote-output 4> remote-error

그러나 fds 3 또는 4를 리디렉션하지 않으면 >&3리디렉션으로 인해 3: Bad file descriptor치명적인 오류가 발생합니다.

이 경우 다음과 같이 기본적으로 /dev/null로 리디렉션할 수 있습니다.

(
   command exec >&3
   command exec 2>&4
   exec ssh host cmd...
) > /dev/null 2>&1

exec아래의 특수 내장 명령을 실행하면 command리디렉션이 실패할 경우 서브셸을 종료하는 특수 효과가 억제됩니다. 이러한 실패한 리디렉션으로 인한 오류는 외부에서 쉽게 삭제할 수 있습니다 > /dev/null 2>&1.

관련 정보