리디렉션을 사용하는 방법을 어떻게 기억할 수 있습니까?


40

나는 그것이 무엇 인줄 안다

  program > /dev/null 2>&1 

그렇습니다. 이것은 출력을 리디렉션 /dev/null2>&1출력이 전송되는 동일한 위치의 에러 출력을 리디렉션하는 것을 의미한다.

내 문제는 그것을 기억하지 못하기 때문에 항상 Google에 저장해야한다는 것입니다.

그래서, 시도 &2>1, 1>2&, 1>&2내가 구글까지 ... 나는 모든 조합을 시도 ...

쉽게 기억하는 비결은 무엇입니까?


같은 문제가 있으므로 "긴"방법으로 리디렉션합니다 program 1> /dev/null 2>/dev/null. 때로는 복잡한 컴파일 프로세스의 출력이 파일로 리디렉션되는 것과 같이 실제로 진행중인 작업을 확인하기 위해 stdout와 를 혼합해야 stderr합니다. 이 경우, 나는 인터넷 검색을 끝
냅니다

답변:


20

출력이 오류보다 낫기 때문에 먼저 나온다 (1 대 2).

>'가는'의 줄임말입니다. 왼쪽에 내가 보내고 싶은 것이 있고 오른쪽에 내가 보내고 싶은 곳이 있습니다. 'where'는 (거의) 항상 파일이므로

program > /dev/null 2>1

앰퍼샌드 (&)는 파일을 파일 디스크립터로 수정합니다.

불행히도, 나는 자신의 니모닉을 보지 못했고 개발하지 않았지만 * nix를 처음 배울 때이 논리적 인 방법이 효과적이라는 것을 알았습니다. 몇 번의 통과 후 두 번째 특성이됩니다.


첫 번째 문장은 이해가되지 않습니다. stdout파일 설명자 1, stderr2입니다. 따라서 "오류"는 "출력"앞에옵니다.
Warren Young

이 문장은 어떤 파일 디스크립터 stdoutstderr참조 를 기억하는 니모닉 입니다.
gvkv

그래도 원래의 질문은 "2> & 1"주문에서 문자의 순서를 기억하는 것에 관한 것이기 때문에 여전히 혼란스러워 보입니다.
Warren Young

9

한 가지 트릭은 1 = 표준 출력, 2 = 표준 오류임을 기억하는 것입니다. 그래서:

2>&1= 표준 오류 스트림은 표준 출력 스트림으로 들어갑니다.
1>&2= 그 반대의 경우도 마찬가지입니다.

C와 같은 언어로 프로그래밍 한 적이 있다면 앰퍼샌드 ( &) 를 기억하기 쉽습니다 . 파일 자체를 변경하거나 새 파일을 만들지 않도록 기존 파일 디스크립터의 "주소"를 참조하는 것으로 생각합니다.


7

을보고 &그렇게, 2의 출력을 가지고로 수행 할 작업에 대해 생각 : 매듭 힘의 도움으로 2>이렇게, 1과 함께 그것을 묶는2>&1


2
방금 "2와 1"이라는 문구를 외 웠습니다. 니모닉이 문구인지 매듭인지에 관계없이 도움이 될 것입니다.
Tim Kennedy

5

실제로, 사용중인 쉘에 따라 다릅니다. 배쉬는 일반적으로 매우 관대하며 다음과 같이 할 수 있습니다.

program &> file

5

다음 세 가지 옵션을 살펴 보겠습니다.

program  2>1
program  2>1& 
program  2>&1

첫 번째는 stderr을 파일 이름 "1"로 보냅니다. 결국 bash는 파일로 리디렉션 할 것으로 예상합니다.

두 번째는 동일한 파일로 리디렉션되지만 program백그라운드에서 실행됩니다 . 즉, 후행 &이 의미합니다.

따라서 세 번째 가능성은 bash 유니버스에서 파일 핸들로 리디렉션하는 유일한 방법으로 남습니다.

0, 1, 2 중 어느 것을 기억 하는가? 콘솔에서 컴퓨터를 실행하는 것을 고려하십시오. 먼저 무언가를 입력해야합니다 (0 = stdin). 그러면 출력이 표시됩니다 (1 = stdout). 마지막으로 무언가 잘못되었을 경우에만 stderr (2)가 나타납니다.


1

벽지에 그립니다.

진지하게, 이것과 내가 잊어 버린 다른 기본적인 것들, 그래서 나는 내가 개발하고 매일 사용하는 앱에 빠른 팁 메뉴를 추가했습니다. 메모를 유지하기 위해 시도하거나 gnote와 같은 것을 사용할 수 있습니다.


1

bash 쉘과 관련하여 내가 기억하는 가장 좋은 방법은 무엇이 일어나고 있는지 이해하는 것입니다.
명령을 올바르게 수행하는 방법을 기억하기 만하면

program > /results 2> /results

그것은 훌륭하고 명백한 일이며 기억하기 쉽습니다. 즉

  • 1 STDOUT는 /results
  • 2STDERR는 것입니다 직접/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때문에의 성격 >이 일을하는

  1. 일반적으로 새 파일을 작성하십시오.이 경우 출력이 생성 될 때 bash가이 루틴을 지나서 기회가 지나갔습니다.
  2. 파일의 시작 부분에 똑바로 삽입하십시오. 처럼 추가 >>하지 않습니다.

따라서이 경우 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>&1STDERR은 STDOUT이 가리키는 곳으로 STDERR을 보냅니다. 그것이 사실이라면-여전히 덮어 쓰기 문제가있을 것입니다.

자세한 내용은 http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection을 참조하십시오 .

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