나는 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>
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
에 대한 리디렉션, 일반 인수 2
및 1
및 리디렉션 충돌로 인해 오류가 발생합니다.
>&
는 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 참조-감사합니다. 나는 결코 배우지 않습니다!
echo &> foo
로 문제를 입증 할 수 있습니다. (2) 필요하지 않은 경우 비동기식 예제 명령을 제공하지 마십시오. (3) 포탄에 대해 배우십시오. Unixverse에는 둘 이상의 셸이 있으며 서로 다른 명령 구문을 허용합니다. 사용중인 셸을 확인하는 방법을 알아보세요.