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 &
어떤 조언이라도 대단히 감사하겠습니다.
답변1
(t)csh를 실행 중인 경우 Ambiguous output redirect.
두 개의 충돌하는 리디렉션을 설정하려고 하면 다음과 같은 일이 발생합니다.
> echo foo > a > b
Ambiguous output redirect.
Bash에서 파일 이름 대신 여러 요소가 포함된 배열을 사용하면 다음과 같은 오류가 발생할 수 있습니다.
$ set aa bb
$ echo foo > "$@"
bash: "$@": ambiguous redirect
답변에서 언급했듯이csh에서 stderr 리디렉션이 작동하지 않습니다., 이 >&
연산자는 (t)csh에서 작동하여 stdout 및 stderr을 리디렉션합니다. 2>&1
이는 stderr을 stdout과 동일한 위치로 리디렉션하는 표준 방법이지만 (t)csh는 이를 지원하지 않습니다. 대신에 > foo 2>&1
리디렉션 대상 foo
, 일반 매개변수 2
및 리디렉션 대상 을 결합하고 1
리디렉션이 충돌하므로 오류가 발생합니다.
>&
Bash 및 zsh에서도 작동하지만 표준 기능은 아닙니다.
답변2
두 번째 항목은 제대로 작동합니다. 있어서는 안되는 공백이 있거나, 반대로 중요한 공백이 누락된 경우 "모호한 리디렉션" 오류가 발생하는 경우가 있습니다.
다음을 보여주기 위해 명령을 단순화하겠습니다.
echo "Test" >/tmp/x.txt 2>&1 &
">/tmp/x.txt" 부분은 stdout(파일 핸들 #1)을 리디렉션합니다. >와 파일 이름 사이에는 공백이 허용되지만(이 경우 혼란스러울 수 있음) 여기에 공백이 있어서는 안 됩니다.
2>&1은 stderr(파일 핸들 2)을 파일 핸들 1(즉, stdout)의 위치로 리디렉션합니다. 여기에도 공백이 있을 수 없습니다.
&는 귀하의 작업에 대한 컨텍스트를 제공합니다. 이전 문자에서 한 공백만큼 오프셋되어야 합니다.
두 가지 리디렉션을 반대로 하면 작동하지 않습니다(여기에서는 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는 주석에서 이것이 실제로 유효한 구문임을 지적했습니다.