it-swarm-ko.tech

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

나는 그것이 무엇 인줄 안다

  program > /dev/null 2>&1 

않습니다. 출력을 /dev/null로 리디렉션하고 2>&1는 출력이 전송 된 동일한 위치에 오류 출력을 리디렉션하는 것을 의미합니다.

내 문제는 내가 기억하지 못하기 때문에 항상 Google을 검색해야한다는 것입니다.

그래서 저는 &2>1, 1>2&, 1>&2를 시도합니다 ... Google을 검색 할 때까지 모든 조합을 시도합니다 ...

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

43
Luc M

출력이 오류보다 낫기 때문에 먼저 발생합니다 (1 대 2).

>는 'goes to'의 약자입니다. 왼쪽은 내가 보내고 싶은 것이고 오른쪽은 내가 보내고 싶은 곳입니다. 'where'는 (거의) 항상 파일이기 때문에

program > /dev/null 2>1

1이라는 파일로 리디렉션됩니다. 따라서 앰퍼샌드 (&) 파일을 파일 설명 자로 수정합니다.

안타깝게도 저는 제 니모닉을 발견하지도 개발하지도 못했지만 처음 * nix를 배우고있을 때이 논리적 인 방법이 잘 작동한다는 것을 알았습니다. 몇 번의 실행 후에는 제 2의 자연이됩니다.

21
gvkv

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

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

C와 유사한 언어로 프로그래밍 한 적이 있다면 앰퍼샌드 (&). 파일 자체를 변경하거나 새 파일을 만들지 않도록 기존 파일 설명 자의 "주소"를 참조하는 것으로 간주합니다.

10
Thronic

&를 매듭으로 보는 것이 도움이 될 수 있습니다. 2의 출력을 취하고 2>를 1과 함께 묶는 것으로 원하는 작업을 생각해보십시오. 따라서 2>&1

7
Bertrand Lorentz

다음 세 가지 옵션을 고려해 보겠습니다.

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

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

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

세 번째 가능성은 bash 유니버스에서 파일 핸들로 리디렉션 할 수있는 유일한 가능성입니다.

0, 1, 2 중 어느 것이 무엇인지 기억하는 방법? 콘솔에서 컴퓨터를 실행하는 것에 대해 생각해보십시오. 먼저 무언가를 입력해야합니다 (0 = stdin). 그러면 출력 (1 = stdout)이 표시됩니다. 마지막으로 문제가 발생하는 경우에만 stderr (2)가 표시됩니다.

5
John1024

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

program &> file
5
Kevin Cantu

벽지에 그립니다.

자, 진지하게, 이것과 다른 기본적인 것들은 잊고 있었기 때문에 내가 개발하고 매일 사용하는 앱에 빠른 팁 메뉴를 추가했습니다. 시도해 보거나 gnote와 같은 것을 사용하여 메모를 보관할 수 있습니다.

1
Eldelshell

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 파일 /tmp/results에 대한 직접 을 가리키는 리디렉션을 bash 설정하고 > 두 가지 일을합니다

  1. normally 새 파일을 만듭니다.이 경우 출력이 생성 될 때 bash가이 루틴을 지나서 이동했기 때문에 기회가 전달되었습니다.
  2. 파일 시작 부분에 바로 삽입하십시오. >>처럼 추가하지 않습니다.

따라서이 경우 STDERR은 STDOUT의 출력을 재정의하는 /tmp/results의 시작 부분에 직접 삽입합니다.
참고 : >>를 사용하여 추가 한 경우이 구문을 사용하지 않을 수 있습니다.
하지만 필요한 문제를 해결하려면 (STDERR을 리디렉션하는 것이 아니라 파일로 직접 리디렉션하는 대신) STDERR의 출력을 STDOUT으로 merge 따라서 충돌이 발생하지 않습니다.
연산자 2>&1 연산자를 사용하면

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

&를 사용하면 bash가 1 파일 및 1 파일 설명자와 구별 할 수 있습니다.
2>&1 문장 자체가 무슨 일이 일어나고 있는지 정확히 설명합니다. STDERR은 STDOUT 자체에서 리디렉션되고 있으며 /tmp/results로만 끝납니다. STDOUT이 가리키는 곳 (거의 부작용).
많은 가이드가 주장하는 것과는 반대로 2>&1는 STDOUT이 가리키는 곳으로 STDERR을 보냅니다. 그것이 사실이라면-여전히 덮어 쓰기 문제가있을 것입니다.

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

1
the_velour_fog

2>&1를 stderr (2) 리디렉션으로 읽으십시오. stdout (1)이 currently 진행됩니다.

왼쪽에서 오른쪽으로 읽고 처리합니다. >file 2>&1의 올바른 읽기는 stdout을 파일로 직접 보낸 다음 stdout이 현재 가고있는 동일한 위치로 stderr를 지정하는 것입니다.

0
ctrl-alt-delor