나는 stderr를 stdout으로 리디렉션 한 다음 init 스크립트의 파일로 내보내려고하는데 stderr를 stdout에 도입하면 “모호한 출력 리디렉션”오류입니다. Stdout만으로는 오류가 발생하지 않고 제가 언급 한 로그 파일에 기록합니다. 다음을 시도했습니다.

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 & 

모든 조언을 주시면 감사하겠습니다.

댓글

li>

  • 어떤 쉘을 사용하고 있습니까?
  • 죄송합니다. Bash에 있음
  • Answer

    (t) csh를 실행하면 Ambiguous output redirect. 두 개의 충돌하는 리디렉션을 설정하려는 경우 :

    > echo foo > a > b Ambiguous output redirect. 

    Bash에서 배열을 사용하면 유사한 오류가 발생할 수 있습니다. 파일 이름 대신 여러 요소 포함 :

    $ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect 

    stderr 리디렉션에 대한 답변에서 언급했듯이 csh , >& 연산자는 (t) csh에서 작동하여 stdout과 stderr을 모두 리디렉션합니다. 2>&1는 stderr를 stdout과 동일한 위치로 리디렉션하는 표준 방법이지만 (t) csh는이를 지원하지 않습니다. 대신 는 foo에 대한 리디렉션, 일반 인수 21 및 리디렉션 충돌로 인해 오류가 발생합니다.

    >&는 Bash 및 zsh에서도 작동하지만 “표준 기능은 아닙니다.

    답변

    두 번째 항목은 정상적으로 작동합니다. 모호한 리디렉션오류는 공백이 있어서는 안되는 공간이 있거나 반대로 중요한 공간이 누락 된 경우에 발생합니다.

    다음을 보여주기 위해 명령을 단순화하겠습니다.

    echo "Test" >/tmp/x.txt 2>&1 & 

    “> / tmp / x.txt”부분은 stdout (파일 핸들 # 1)을 리디렉션합니다.>와 파일 이름 사이에 공백이 허용됩니다 (이 컨텍스트에서는 혼란 스러울 수 있지만 그렇지 않으면 여기에 공백이 없어야합니다.

    2> & 1은 stderr (파일 핸들 2)를 어떤 파일로든 리디렉션합니다. 핸들 1은 (표준 출력)으로 이동합니다. 여기에도 공백이 없어야합니다.

    &는 작업을 배경으로합니다.이 값은 오프셋이어야합니다. 앞 문자의 공백이 있습니다.

    두 리디렉션을 되 돌리는 것은 작동하지 않습니다 (echo는 stderr 출력을 생성하지 않기 때문에 여기서는 좋지 않은 선택이지만) :

    echo "This will not work" 2>&1 >/tmp/x.txt & 

    의미 :

    2>&1 

    파일 핸들 2를 파일 핸들 1이가는 곳 (이 시점에서 여전히 콘솔 임)

    >/tmp/x.txt 

    파일 핸들 1을 파일로 리디렉션-하지만 파일 핸들 2 (stderr) 이후 이 시점에서 이미 리디렉션되어 목적지를 유지하고 콘솔로 이동합니다.

    작성한 첫 번째 명령은 단순히 구문 오류입니다.

    echo &>/tmp/x.txt 

    업데이트 : @Wildcard는 댓글에서 이것이 실제로 유효한 구문이라고 지적했습니다.

    댓글

    • The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces. 공백을 포함 할 수 있습니다. command >out.txt == command > out.txt
    • 맞습니다. 나는 거기에서 실수했다. 문제를 해결합니다.
    • " 작성한 첫 번째 명령은 단순히 구문 오류입니다. " 아니요, 맞습니다. '는 아닙니다. 그것은 ' stdout 및 stderr 모두를 리디렉션하기위한 선호하는 Bash 구문입니다. LESS='+/Redirecting Standard Output and Standard Error' man bash
    • @Wildcard 참조-감사합니다. 나는 결코 배우지 않습니다!

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다