배쉬에서.
무엇을 사용해야 할지 파악하는 데 문제가 있나요?
내 모든 스크립트는 ">>/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>&