출력을 2> & 1 및 1> & 2로 리디렉션하는 이유는 무엇입니까?


36

나는 그 사용 여러 가지 명령을 가로 질러 온 2>&11>&2,하지만 난 그것을 사용되어야 할 때 나는 확실히 그것을 사용하는 목적 주위에 내 머리를 얻을 수 없습니다.

내가 이해하는 것

나는 1표준 출력을 2나타내고 표준 오류를 나타냅니다. 나는 ~ 2>&1의 출력 과 그 반대로 의 결합을 이해합니다 .21

내가 얻지 못한 것

  1. 언제 사용해야합니까?
  2. 어떤 목적으로 사용됩니까?

답변:


39

때로는 stdout stderr을 동일한 위치 로 리디렉션하려고합니다. 이때 >&사용됩니다. 파일 설명자를 다른 파일 디스크립터로 가리 킵니다.


예를 들어 stdout과 stderr을 모두 같은 파일 ( /dev/null또는 파일)에 쓰려면 다음을 사용 output.txt하여 개별적으로 리디렉션 할 수 있습니다.

app 1>/dev/null 2>/dev/null

또는 하나의 파일 설명자를 파일로 리디렉션하고 다른 파일 설명자를 첫 번째 설명 자로 리디렉션 할 수 있습니다.

app 1>/dev/null 2>&1

app 2>/dev/null 1>&2

첫 번째 예에서는 2>&1파일 설명자 # 2를 # 1이 이미 가리키는 위치를 가리 킵니다. 두 번째 예제는 stderr로 시작하여 동일한 결과를 얻습니다.

다른 예로, stdout (파일 설명자 # 1)이 이미 원하는 위치를 가리키고 있지만 이름으로 참조 할 수없는 경우가 있습니다 (파이프, 소켓 등과 연관 될 수 있음). 이는 일반적으로 stdout 만 캡처하는 프로세스 확장 ( ` `또는 $( )연산자)을 사용할 때 발생 하지만 stderr을 포함시킬 수 있습니다. 이 경우 >&stderr이 stdout을 가리 키도록 사용할 수도 있습니다 .

out=$(app 2>&1)

다른 일반적인 예는 호출기 grep또는 유사한 유틸리티입니다. 파이프는 |일반적으로 stdout에서만 작동하므로 파이프를 사용하기 전에 stderr을 stdout으로 리디렉션합니다.

app 2>&1 | grep hello

어떻게 어떤 알고 2>&1또는 1>&2정확? 이미 설정 파일 기술자가 오른쪽으로 이동 >&하고, 리디렉션 할 파일 기술자는 왼쪽으로 간다. ( 2>&1"파일 디스크립터 # 2에서 파일 디스크립터 # 1"을 의미합니다.)


일부 셸에는 일반적인 리디렉션에 대한 바로 가기가 있습니다. Bash의 예는 다음과 같습니다.

  • 1> 그냥 단축 할 수 있습니다 >

  • 1>foo 2>&1>&foo&>foo

  • 2>&1 | program|& program


나는 app 1>/dev/null 2>&12> & 1이 1이 이미 리디렉션하고있는 파일을 가리킬 것이라는 것을 몰랐다 . 내가 할 수있는 것처럼 쉽게 할 수 app > /dev/null &>있습니까?
PeanutsMonkey 1

이해하는데 어려움을 겪고 the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left있습니다. 이미 설정된 파일 디스크립터 란 무엇을 의미합니까? 의 권리는 무엇을 의미합니까?
PeanutsMonkey 2018 년


지시 사항을 가르쳐주지 않는 한 죄송합니다. 이전에 언급 한 내용에 따르지 않습니다.
PeanutsMonkey

1
각 파일 디스크립터 리디렉션을 한 번에 하나씩 왼쪽에서 오른쪽으로 가져 와서 해당 규칙을 순서대로 적용하십시오. 당신이 경우 첫 번째 파일에 직접 표준 출력, 그 다음 우리가 지금 가리키는 표준 출력 위치로 리디렉션 표준 에러는 표준 오류 및 표준 출력 같은 파일로 이동합니다. 당신이 주변 사람들이 리디렉션을 교환하는 경우 (리디렉션 표준 오류 표준 출력이가는 곳으로, 당신은 다른 결과를 얻을 것입니다 지금 이에서 지적 된 위치 표준 오류가 계속하면서, 다음, 다른 파일을 가리 키도록 표준 출력으로 이동).
Jason

2

필요할 때 한 가지 상황 strace은 호출기에 출력 을 표시하려는 경우 입니다. strace출력을 표준 오류에 출력 하고 파이프는 일반적으로 표준 출력 을 표준 입력에 연결 하므로 리디렉션을 사용해야합니다.

strace -p $pid 2>&1 | less

무슨 소리 야 pipes generally connect standard output to standard input?
PeanutsMonkey 2016 년

2
파이프 ( |)는 첫 번째 명령의 표준 출력을 가져와 두 번째 명령의 표준 입력에 연결합니다.
jpalecek 2016 년

2

때로는 stdout( 1)와 stderr( 2)를 동일한 위치 ( /dev/null예 :)로 리디렉션하려고합니다 . 이를 달성하는 한 가지 방법은 다음과 같습니다.

$ program 1>/dev/null 2>/dev/null

그러나 대부분의 사람들은 다음으로 리디렉션 stderr하여이를 줄 stdout입니다 2>&1.

$ program 1>/dev/null 2>&1

더 짧은 버전은 다음과 같습니다.

$ program >&- 2>&-

1

2 : 표준 오류와 표준 출력에서 ​​출력을 가져오고 단일 문자열로 구성하려는 경우를위한 것입니다.

1 : 표준 오류와 표준 출력의 출력을 조작하려는 경우.


조작한다는 것은 무슨 뜻입니까? 내 이해는 리디렉션 된 >2것이 / dev / null로 전송 된다는 것 입니다. 아니면 내가 잘못 알고 있습니까?
PeanutsMonkey 2016 년

맞지 않습니다. 조작함으로써 grep 또는 이와 유사한 것으로 파이프를 의미합니다. 예를 보려면 여기 를 참조 하십시오 .
soandos 2016 년

0

분리 된 작업을 시작하는 데 사용합니다.

someProgram 2>&1 >& my.log &

그런 다음 로그 아웃 할 수 있으며 일부 프로그램은 여전히 ​​실행 중입니다. 이 기능은 GNU Screen, tmux 및 일부 다른 프로그램에서 제공하지만 외부 종속성 없이는 달성 할 수 있습니다.


1
SIGHUP이 프로그램으로 전송되지 않는 한 작동합니다. 더 나은 사용 nohup또는 disown그러한 경우에.
slhck

@ slhck : 알았어. 그러나 내가 SIGHUP을 프로그램에 보내지 않으면 아무도 할 수 없다.
Adobe

아니오, 제어 터미널은 SIGHUP을 사용하여 로그 아웃 프로세스에 경고합니다. 실제로 SSH를 통해 원격 셸을 실행하고 종료하면 프로세스도 종료됩니다.
slhck

@ slhck : 사실 일 수는 없습니다 : 몇 년 동안 사용했습니다 .ssh에서 로그 아웃했는데 프로세스가 여전히 실행 중입니다.
Adobe

좀 더 자세히 살펴 봐야하지만 백그라운드에 프로그램을 넣는 것이 모든 경우에 효과가 없었으며 로컬 컴퓨터에서도 작동하지 않습니다. Zsh와 Bash는 여기서 다르게 작동합니다.
slhck

0

try다음 세 파일 이있는 디렉토리가 있다고 상상해보십시오 .file file1 and file2.

이제이 명령을 실행하십시오 :

cat file file1 file2 file3

처음 세 파일은 열리지 만 cat존재하지 않는 네 번째 파일을 여는 동안 오류가 발생합니다.

이제 다음을 실행하십시오.

cat file file1 file2 file3 1>outfile 2>&1

첫째 : 당신은 화면에 출력을 볼 수 없습니다 1>outfile에 대한 명령의 출력을 리디렉션합니다 outfile다음은 (리디렉션 2>&1열려고하는 동안 오류가 발생) file3outfile.

1>&2 비슷하게 작동하고 오류 스트림을 표준 출력으로 리디렉션합니다.

이것이 도움이되기를 바랍니다!


0

대체 시나리오 : 터미널 명령은 다른 터미널로 출력을 표시합니다.

tty각 터미널 에서 명령을 사용하여 식별하십시오.

$ tty
/dev/pts/0

$ tty
/dev/pts/1

이 TTY를 가정하면 첫 번째 stdout을 두 번째 stdout으로 리디렉션하려면 첫 번째 터미널에서 다음을 실행하십시오.

exec 1>/dev/pts/1

참고 : 이제 모든 명령 출력 이 pts / 1에 표시됩니다.

pts / 0의 기본 동작 stdout을 복원하려면 다음을 수행하십시오.

exec 1>/dev/pts/0

데모는 이 비디오 를 참조하십시오 .


0

stderr를 stdout으로 리디렉션하는 경우는 이미 여기에서 다룹니다 (예 : 오류 메시지를 필터링 (grep)하는 데 사용).

다른 경우는 stdout을 stderr로 리디렉션하는 것입니다. 일반적인 유스 케이스 (적어도 나에게는)는 "echo"로 인쇄 된 경고 / 오류 메시지를 내 쉘 스크립트에 보내서 사용자의 관심을 더 쉽게 끌 수있게하는 것이다.

예를 들어

echo "file \"${file\" does not exist..." 1>&2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.