프로그램이 STDOUT / STDERR 이외의 다른 곳으로 어떻게 출력됩니까? 그것을 피하는 방법?


15

분명히 사용 가능한 모든 출력 대상을 모릅니다. stdout( &1) 및 stderr( &2) 에 대해 알고 있습니다. 그러나 두 디스크립터를 리디렉션 한 후에도 때때로 콘솔에 출력이 표시되는 경우가 있습니다 !

내가 생각할 수있는 가장 쉬운 예는 GNU Parallel입니다. 사용할 때마다 인용 알림이 표시됩니다. 내가 할 때에도 &2>1 > file여전히 통지를 볼 수 있습니다.

그리고 같은이 적용 emergeI이 등장 실행하고 몇 가지 문제가있을 경우, 어떤 정보가 인쇄되지 않습니다 : stdoutstdin, 내가 그들을 리디렉션 이후 그들은 여전히 통과.

나는 주로을 사용하여 이러한 문제를 해결 script하지만 여전히이 문제의 원인이 무엇인지 궁금합니다.


1
전체 예를 제공하십시오 .
Kusalananda


8
당신은 그들 모두를 얻을 수 없습니다 . 스크립트는 항상 쓸 수 /dev/tty있습니다.
사토 카츠라

1
GNU에 관해서 parallel: mkdir ~/.parallel; touch ~/.parallel/will-cite성가신 메시지를 비활성화합니다. 또는의 다른 구현을 둘러보십시오 parallel.
사토 카츠라

2
@OleTange 문제가 아니기 때문에-왜 일이 일어나고 있는지 묻고 parallel예제로 사용 하고 있습니다.
MatthewRock

답변:


40

사용한 구문이 잘못되었습니다.

cmd &2>1 >file

로 분할됩니다

cmd &
2>1 >file

이것은 :

  1. cmd리디렉션없이 백그라운드 작업으로 실행
  2. 별도의 프로세스에서 (명령없이!) stderr문자 그대로 호출 된 파일로 1리디렉션 stdout하고file

원하는 구문은 다음과 같습니다.

cmd >file 2>&1

작업 순서가 중요합니다. 이것은 :

  1. 리디렉션 stdoutfile
  2. 리디렉션 stderr&1- 즉 같은 파일 핸들로stdout

결과는 stderrstdout로 리디렉션됩니다 file.

에서 bash, 더 간단한 비표준 (따라서 이식성 측면에서 권장하지 않음) 구문은 cmd &> file동일한 작업을 수행합니다.


감사합니다 다른 문제는 일 수도 있지만 /dev/tty, 이것이 너무 자주 발생하지 않기를 바랍니다.
MatthewRock

5
at머신에 명령 이 있고 사용할 권한이있는 경우을 통해 명령을 실행할 수 있습니다 at now. 자세한 내용은 맨 페이지를 참조하십시오. 이것은 배치 프로세스 메커니즘을 통해 명령을 실행하며 프로세스에는 쓸만한 tty가 없습니다. 그러나 일반적 으로이 가장자리에 대해서는 걱정하지 않습니다. 일반적으로 상호 작용이 필요한 프로세스 만 리디렉션이 사용됨에도 불구하고 의도적으로 사용자에게 표시해야합니다 /dev/tty.
Stephen Harris

거기, 다 그
davidbak

10

두 가지 문제가 있습니다.

첫 번째는 순서가 중요하고 두 번째는 /dev/tty입니다.

이 스크립트를 다음에서 출력을 캡처하려는 예제 스크립트로 사용하십시오.

test.sh:

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

이제 명령의 출력을 보자.

./testmyscript.sh 2>&1 >/dev/null:

edada
ttdada

평가 순서는 왼쪽에서 오른쪽이므로 먼저 " 출력하는 stderrstdout(콘솔 출력)으로 리디렉션"을 얻습니다 . 그런 다음 "리디렉션 stdout/dev/null받습니다. 다음 과 같은 상황이 발생합니다.

stdout-> /dev/null stderr-> 콘솔

그래서 우리는 그것을 올바르게 얻습니다.

./testmyscript.sh >/dev/null 2>&1

그리고 우리는 :

ttdada.

이제 우리는 "리디렉션을 수행 stdout하는 /dev/null다음"및 "표준 출력이 가리키는 곳으로 리디렉션 표준 오류"(지금을 /dev/null). 만세!

그러나 여전히 문제가 있습니다. 프로그램이로 인쇄됩니다 /dev/tty. 이제 나는 이런 종류의 행동을 고치는 법을 모른다. 그래서 당신은 아마도 필요할 것 script같지만, 이런 행동이 너무 자주 일어나지 않기를 바란다.

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