시작하는 프로세스에서 모든 콘솔 출력을 실제로 숨기려면 어떻게 해야 합니까? [복사]

시작하는 프로세스에서 모든 콘솔 출력을 실제로 숨기려면 어떻게 해야 합니까? [복사]

Firefox에서 관심 없는 모든 메시지를 받았습니다.

Gtk-Message: Failed to load module "pk-gtk-module"
Gtk-Message: Failed to load module "canberra-gtk-module"

그래서 firefox다음과 같이 종료하고 다시 시작합니다.

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

"리디렉션 stderr하고 stdout둘 다 null"로 파이프합니다.

불행하게도 그 불쾌한 메시지는 사라지지 않았습니다. 사실, firefox현재 이 질문을 입력하고 있는 세션을 시작한 터미널 창에서는 여전히 질문을 생성하고 있습니다.

질문은 다음과 같습니다.

위의 리디렉션이 작동하지 않는 이유는 무엇입니까?

어떻게 올바르게 리디렉션합니까?

답변1

이 작업은 역순으로 수행해야 합니다. 먼저 stdout을 리디렉션한 다음 stderr를 stdout으로 리디렉션합니다.

firefox >/dev/null 2>&1 &

편집: 여기에 설명이 있습니다. 2>&1파일 설명자 복사 작업입니다(bash 매뉴얼 페이지 및 검색 참조 Duplicating File Descriptors): "파일 설명자 1과 동일한 작업을 수행하기 위해 파일 설명자 2를 복사합니다"를 의미합니다. 그 후, fd 2에 기록된 모든 내용은 fd 1이 해당 내용을 보낸 곳으로 전송됩니다. 따라서 stderr(2)와 stdout(1)은 동일한 위치에 기록됩니다. 그러나 이들은 독립적이므로 나중에 fd 1을 변경하면(예: stdout을 리디렉션하여) fd 2는 변경되지 않은 상태로 유지됩니다. fd 1이 쓰고 있는 위치에 계속 기록됩니다.앞으로마지막 리디렉션입니다.

먼저 stdout을 리디렉션한 다음 복사하면 fd 1과 fd 2는 모두 fd 1이 리디렉션되는 동일한 위치에 기록됩니다.

기본적으로 쉘은 왼쪽에서 오른쪽으로 리디렉션/반복을 수행하므로 순서가 올바른지 확인해야 합니다.

덧붙여서, 특별한 경우로 bash는 stdout과 stderr을 동일한 위치로 리디렉션하는 단축키를 제공합니다.

 cmd &> /dev/null

동등하다

  cmd > /dev/null 2>&1

관련 정보