다음 사이에 차이점이 있는지 궁금합니다.
echo "running the npm patch" >&2;
그리고
echo "running the npm patch" &>2;
저는 실제로 이 구문을 전혀 이해하지 못했습니다.
답변1
설명서의 리디렉션 섹션을 주의 깊게 읽어보세요.https://www.gnu.org/software/bash/manual/bashref.html#Redirections
이 cmd >&2
양식은 "3.6.8 파일 설명자 복사" 섹션에 설명되어 있습니다.
[n]>&word
여기서는 n
지정되지 않았으므로 기본값은 stdout을 의미하는 "1"입니다. stdout을 stderr을 의미하는 파일 설명자 "2"로 리디렉션합니다. 명령의 모든 일반 출력은 stderr로 전송됩니다.
이 cmd &>2
양식은 "3.6.4 표준 출력 및 표준 오류 리디렉션" 섹션에 설명되어 있습니다.
표준 출력과 표준 오류를 리디렉션하는 데는 두 가지 형식이 있습니다.
&>word
그리고
>&word
두 가지 형식 중 첫 번째 형식이 선호됩니다. 이는 의미상 다음과 동일합니다.
>word 2>&1
이 경우 "word"는 "2"이므로 명령의 stdout 및 stderr을 2
.
$ sh -c 'echo stdout; echo stderr >&2' &>2
$ ls -l 2
-rw-rw-r-- 1 jackman jackman 14 May 14 21:40 2
$ cat 2
stdout
stderr
공부하면서 모든 것이 매우 혼란스럽다는 것을 알았습니다. 그것에 충실하십시오. 리디렉션은 엄격하게 왼쪽에서 오른쪽으로 수행된다는 점을 기억하세요. 예를 들어
$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr
"stdout" 문자열이 파일로 전송되지 않는 이유는 무엇입니까?
왼쪽에서 오른쪽으로:
1>&2
-- 제 생각에는 "파일 설명자 1을 다음으로 리디렉션하는 것 같습니다."파일 설명자 2가 현재 사용하고 있는 것이 무엇이든 간에". 현재 fd 2는 /dev/stderr을 가리킵니다. 따라서 이제 fd 1도 /dev/stderr을 가리킵니다.2>some.file
-- 지정된 파일에 쓰도록 fd 2를 변경합니다. 이것은 실제로아니요fd 1이 현재 사용하고 있는 것을 변경합니다.
우리가 바꾸고 싶다면주문하다리디렉션을 수행하면 다른 결과를 얻게 됩니다.
$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file
stdout
stderr
우리는 fd 2를 변경했기 때문에첫 번째.그 다음에fd 1을 fd 2의 위치로 리디렉션현재 사용중.
내 용어가 잘못되었을 수 있습니다("가리키다" 등). 이것이 내가 리디렉션이 작동했던 것을 기억하는 방법입니다.