2012-10-20 3 views
0

나는 BashFAQ/002을 읽고 다음 리다이렉션 케이스에 걸쳐 왔습니다. 나는 각각의 경우에 대한 나의 이해를 기록 했으므로 내가 틀렸다면 의견을 말하십시오.Bash : 다음 리디렉션 케이스를 설명하십시오.

사례 1

output=$(command 2>&1 >/dev/tty) 

리디렉션 stderrstdout하고 이상이 ttystdout를 리디렉션합니다. 따라서 이제 stdout and stderr은 터미널로 리디렉션/출력됩니다.

사례 2

output=$(command 2>&1 >/dev/null) 

리디렉션 stderrstdout하고 이상이 /dev/nullstdout를 리디렉션합니다. 비록 지금은 stderr and stdout 두 가지가 모두 버려지기 때문에이 지점을 이해할 수는 없지만.

아니, 생각이 무엇이든지 무슨 여기 일이 3

output=$(command 3>&2 2>&1 1>&3-) 

케이스. 나는 fd 3을 모르고있다.

사례 4

exec 3>&1 
output=$(command 2>&1 1>&3) 
exec 3>&- 

아니, 생각을 다시.

누군가 제 3의 사례와 4 번째의 사례에 대해 자세히 설명하고 관련 문서를 알려줄 수 있습니까? 열려있는 각 파일은 파일 기술자를 할당됩니다 : 당신이 결과에 대해 걱정하지 않는다 나타냅니다는/dev/null로 데이터를 전송

+0

case 2 : 'stderr와 stdout이 모두 버려 졌기 때문에'- _that_는/dev/null로 보내기위한 포인트입니다. – mcalex

+1

^사실이 아닙니다. stdout 만'/ dev/null'으로 리디렉션됩니다. – doubleDown

답변

2

사례 1과 2는 설명하는 것을 수행하지 않습니다. 두 경우 모두 stderr에 연결된 stdout으로 리디렉션되고stdout은 리디렉션됩니다. 두 경우 모두 outputstderr에 인쇄 된 command을 저장하고 stdout/dev/tty/dev/null으로 각각 리디렉션됩니다. (here과 bash 문서

3은 또 다른 파일 설명자입니다. 그것에 대해 "마법"이란 것은 없으며 응용 프로그램/명령/스크립트는 그 기능을 정의합니다.

끝에 -이있는 양식은 REDIRECTION 및 Moving File Descriptors의 bash 문서 및 A Detailed Introduction to I/O and I/O Redirection을 참조하십시오.

+0

감사합니다. 관련 문서 링크를 읽은 후 다시 돌아올 것입니다. – RanRag

1

2>&1은 stderr에 stdout을 복제하고 있다는 것을 의미합니다. 즉,stderr을 현재 가리키는 곳으로 stderr를 리다이렉션한다 (이것을 "stdout의 위치"라고 부름으로써 단순화하자).

이 리디렉션은 값으로 전달하는 것과 유사하며 참조로 전달하지 않습니다. 따라서 stdout을 나중에 리디렉션하면 stderr도 리다이렉션되지 않습니다.

output=$(command 2>&1 >/dev/tty)

  • 2>&1가 표준 출력의 위치에 표준 오류 리디렉션으로 설명합니다.
  • >/dev/tty은 stdout을 /dev/tty으로 리디렉션하지만 stderr는 변경되지 않습니다.

FDS 3-9 원하는하지만 사용할 수 있습니다, 예를 들어, 일시적으로 다른 FD의 위치를 ​​저장하거나 파일을 가리키는 것.

사례 3에서 stderr의 위치와 stdout의 위치가 전환되는 동안 FD3을 사용하여 일시적으로 stderr의 위치를 ​​저장합니다.

:

  • 열려진에 FD3의 위치는 다음 FD3을 사본을 닫습니다 1>&3-
  • 3>&-는 사용 사례 4 꽤 많은 사례 3. exec 3>&1과 동일 FD3

을 닫습니다 Case 4의 경우 현재 쉘의 모든 후속 명령에 영향을 미칩니다 (exec 3>&-으로 끝날 때까지). 반면에 case 3 limi의 3>&1 리디렉션은 command에만 해당됩니다.

관련 문제