답변:
출력이 오류보다 낫기 때문에 먼저 나온다 (1 대 2).
>
'가는'의 줄임말입니다. 왼쪽에 내가 보내고 싶은 것이 있고 오른쪽에 내가 보내고 싶은 곳이 있습니다. 'where'는 (거의) 항상 파일이므로
program > /dev/null 2>1
앰퍼샌드 (&)
는 파일을 파일 디스크립터로 수정합니다.
불행히도, 나는 자신의 니모닉을 보지 못했고 개발하지 않았지만 * nix를 처음 배울 때이 논리적 인 방법이 효과적이라는 것을 알았습니다. 몇 번의 통과 후 두 번째 특성이됩니다.
stdout
파일 설명자 1, stderr
2입니다. 따라서 "오류"는 "출력"앞에옵니다.
stdout
와 stderr
참조 를 기억하는 니모닉 입니다.
을보고 &
그렇게, 2의 출력을 가지고로 수행 할 작업에 대해 생각 : 매듭 힘의 도움으로 2>
이렇게, 1과 함께 그것을 묶는2>&1
다음 세 가지 옵션을 살펴 보겠습니다.
program 2>1
program 2>1&
program 2>&1
첫 번째는 stderr을 파일 이름 "1"로 보냅니다. 결국 bash는 파일로 리디렉션 할 것으로 예상합니다.
두 번째는 동일한 파일로 리디렉션되지만 program
백그라운드에서 실행됩니다 . 즉, 후행 &
이 의미합니다.
따라서 세 번째 가능성은 bash 유니버스에서 파일 핸들로 리디렉션하는 유일한 방법으로 남습니다.
0, 1, 2 중 어느 것을 기억 하는가? 콘솔에서 컴퓨터를 실행하는 것을 고려하십시오. 먼저 무언가를 입력해야합니다 (0 = stdin). 그러면 출력이 표시됩니다 (1 = stdout). 마지막으로 무언가 잘못되었을 경우에만 stderr (2)가 나타납니다.
벽지에 그립니다.
진지하게, 이것과 내가 잊어 버린 다른 기본적인 것들, 그래서 나는 내가 개발하고 매일 사용하는 앱에 빠른 팁 메뉴를 추가했습니다. 메모를 유지하기 위해 시도하거나 gnote와 같은 것을 사용할 수 있습니다.
bash 쉘과 관련하여 내가 기억하는 가장 좋은 방법은 무엇이 일어나고 있는지 이해하는 것입니다.
명령을 올바르게 수행하는 방법을 기억하기 만하면
program > /results 2> /results
그것은 훌륭하고 명백한 일이며 기억하기 쉽습니다. 즉
1
STDOUT는 /results
2
STDERR는 것입니다 직접 에/results
문제는 예상대로 작동하지 않는다는 것입니다. 다음을 고려하세요:
파일: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
그리고 명령을 실행
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
그때
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
여기 뭔 일 있었 니?
나의 이해는 STDERR를 가리키는 리디렉션 bash는 설정입니다 직접 파일에 /tmp/results
때문에의 성격 >
이 일을하는
>>
하지 않습니다.따라서이 경우 STDERR /tmp/results
은 STDOUT의 출력을 대체하는 시작 부분에 직접 삽입합니다 .
참고 : >>
추가하는 데이 구문 을 사용 하지 못할 수도 있습니다.
그러나 문제를 해결하려면 STDERR을 파일로 직접 리디렉션하지 말고 STDERR의 출력을 STDOUT 스트림으로 병합 해야 충돌이 발생하지 않습니다.
연산자 2>&1
연산자를 사용하면
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
는 &
라는 이름의 파일 구분하기 배쉬 가능 1
하고, 1
파일 기술자.
저에게 성명서 2>&1
자체는 STDERR이 STDOUT 자체로 리디렉션되고 /tmp/results
있으며 STDOUT이 지적되는 곳 (거의 부작용) 때문에 끝나는 상황을 정확하게 설명합니다 .
많은 가이드가 주장하는 것과는 달리 2>&1
STDERR은 STDOUT이 가리키는 곳으로 STDERR을 보냅니다. 그것이 사실이라면-여전히 덮어 쓰기 문제가있을 것입니다.
자세한 내용은 http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection을 참조하십시오 .
program 1> /dev/null 2>/dev/null
. 때로는 복잡한 컴파일 프로세스의 출력이 파일로 리디렉션되는 것과 같이 실제로 진행중인 작업을 확인하기 위해stdout
와 를 혼합해야stderr
합니다. 이 경우, 나는 인터넷 검색을 끝