`>> /dev/stderr`(공백 포함)과 `>&2`의 차이점은 무엇입니까?

`>> /dev/stderr`(공백 포함)과 `>&2`의 차이점은 무엇입니까?

배쉬에서.

무엇을 사용해야 할지 파악하는 데 문제가 있나요?

내 모든 스크립트는 ">>/dev/stderr"를 사용합니다.

bash 프롬프트에서 시도하면:
echo test >>/dev/stderr유효한
echo test >> /dev/stderr유효한
echo test >/dev/stderr유효한
echo test > /dev/stderr

echo test >>&2실패한!
echo test >> &2실패한!
echo test >&2작업이
echo test > &2실패했습니다!

모든 스크립트를 >&2.

또한 전혀 작동하지 않고(권한 거부됨) 작동만 하는 ssh(나중에)에 su SomeUser큰 영향을 미치는 것으로 보입니다 .>>/dev/stderr>&2

답변1

>& n쉘 구문은 다음과 같습니다파일 설명자를 직접 복사. 파일 설명자 2는 stderr입니다. 이것이 작동하는 방식입니다. stderr뿐만 아니라 다른 파일 설명자를 복사할 수도 있습니다. 복사 파일 설명자가 잘리지 않고(stderr이 파일인 경우에도) >&토큰이기 때문에 여기에서 추가 모드를 사용할 수 없습니다. 따라서 공백을 넣을 수는 없지만 >& 2작동합니다.

>> name는 허용되는 다른 구문입니다. 여기서 은 name파일 이름입니다(토큰은 >>). 이 경우 /dev/stderr운영 체제별 처리를 통해 표준 오류에 해당하는 파일 이름을 사용하고 있습니다(Linux에서는 심볼릭 링크 /proc/self/fd/2). stderr이 터미널인 경우 추가 모드와 자르기 모드 모두 동일한 작업을 수행합니다. 왜냐하면 잘라낼 수 없기 때문입니다. 그러나 표준 오류가 파일인 경우에는~ 할 것이다잘림:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

ssh 에서 오류가 표시되면 /dev/stderr서버 관리자가 심볼릭 링크 작동을 방지하는 일부 보안 조치를 적용했을 수 있습니다. (예: /proc또는 에 액세스할 수 없습니다 /dev). 두 가지 접근 방식 모두 모든 종류의 이상한 손상을 초래할 것으로 예상하지만 중복 파일 설명자 구문을 사용하는 것이 완벽하게 합리적이고 아마도 약간 더 효율적인 접근 방식입니다. 나는 개인적으로 그것을 선호합니다.

답변2

실패 사례가 발생하는 이유는배시 구문&리디렉션에서 단일을 지정 >하고 기호에 직접 인접하도록 요구하는 데 사용됩니다 &.

[n]>단어(&W)

답변3

'>'리디렉션(있는 경우 자르기) 또는 '>>'(있는 경우 추가) 에 사용됩니다 .

스트림을 복사하는 데 유용합니다 '>&'. 예를 들어 stdout과 stderr을 동일한 파일에 넣고 싶다면 '> output.log'오류가 있는 파일로 리디렉션하세요.'2>&'

myjob.sh > output.log 2>&

관련 정보