모호한 출력 리디렉션

모호한 출력 리디렉션

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는 주석에서 이것이 실제로 유효한 구문임을 지적했습니다.

관련 정보