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


11

bash에서.

사용해야 할 것을 결정하는 데 어려움이 있습니까?

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

bash 프롬프트에서, 내가 시도하면 :
echo test >>/dev/stderrWorks
echo test >> /dev/stderrworks
echo test >/dev/stderrworks
echo test > /dev/stderrworks

echo test >>&2실패!
echo test >> &2실패!
echo test >&2작품
echo test > &2하지 못한!

모든 스크립트를로 변경하려고합니다 >&2.

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


ssh 오류의 예를 보여 줄 수 있습니까? 나는 그것을 재생할 수 없습니다.
Jeff Schaller

@JeffSchaller 당신이 맞아요, su문제가 발생한 후에야 질문이 업데이트되었습니다
Aquarius Power

@AquariusPower, ... 불일치를 설명하기 위해 :로 su -c 'some command', 해당 명령이 /bin/shnot에 의해 실행 bash되므로 bash 특정 동작 (예 : /dev/stderr사용할 수없는 경우 리디렉션 목적 으로 시뮬레이션 )이 보장되지 않습니다.
Charles Duffy

답변:


22

>& n파일 디스크립터직접 복제하는 쉘 구문 입니다. 파일 디스크립터 2는 stderr입니다. 그것이 그 작동 방식입니다. stderr뿐만 아니라 다른 파일 디스크립터도 복제 할 수 있습니다. 파일 디스크립터를 복제해도 stderr가 파일이더라도 파일이 잘리지 않고 >&하나의 토큰 이기 때문에 추가 모드를 사용할 수 없으므로 공간을 넣을 수는 없지만 >& 2작동합니다.

>> name다른 구문, 허용되는 name파일 이름입니다 (그리고 토큰입니다 >>). 이 경우 파일 이름을 사용하고 있습니다. /dev/stderrOS 별 처리 (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

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


나는 이전에 가지고 있던 잘린 문제를 복제하려고 시도하는 데 큰 어려움을 겪었습니다 (그렇지 않으면 질문 hehe에 추가했을 것입니다) >>. 또한, su SomeUserssh를 통해 연결 한 단계를 놓쳤습니다 .
물병 자리 힘

이것은 bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/footho를 자르지 않을 것입니다! (와 함께조차도 2>&1 |tee /tmp/foo) 로깅에 완벽한 것은 무엇이며로 변경하면 완벽하게 작동합니다 >&2. 따라서 직접 파일 사용만으로 /dev/stderr복제 된 설명자가 아닌 잘림을 허용 한다고 생각합니다 .
물병 자리 힘

@AquariusPower 정확하고 중복 된 파일 설명자는 절대로 잘리지 않습니다. 그것은 첫 번째 단락에 있습니다. 어쩌면 강조해야할까요?
derobert

필요하지 않음, 나는 때때로 ehehe 느리다
Aquarius Power

3
이 답변은 향상 될 수 있습니다. > &는 하나의 토큰이 아니며 OP의 혼란입니다.
Joshua

8

경로 재 지정 에 사용 하기위한 bash 구문& 이 single을 지정 >하고 &부호에 직접 인접해야 하기 때문에 실패 사례가 발생 합니다 .

[n]> & 단어


2

사용 '>'리디렉션 (존재하는 경우 자릅니다) 또는 '>>'(존재하는 경우에 추가).

사용하여 '>&'동일한 파일에 표준 출력 및 표준 오류를 원하는 경우, 당신은 파일로 리디렉션, 예를 들어, 스트림을 중복 '> output.log'도 및 오류와'2>&'

myjob.sh > output.log 2>&
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.