터미널에서 프로그램을 시작하기 위해 다음 명령을 사용했습니다.
program_name >/dev/null 2>&1 &
그런데 최근에 만난이 페이지다음 방법이 권장됩니다.
program_name </dev/null &>/dev/null &
이제 첫 번째가 무엇을 의미하는지 알겠습니다. 이는 stderr을 stdout으로 지정하고 stdout을 /dev/null로 지정하는 것을 의미합니다. 즉, 이제 stderr과 stdout은 모두 null을 가리킵니다.
그런데 두 번째는 무슨 뜻인가요? 터미널에서 헤드리스로 프로그램을 시작하는 데 어느 것이 더 좋습니까?
답변1
stdin
기본적으로 프로그램을 실행할 때 표준 입력( ), 표준 출력( stdout
) 및 표준 오류( ) 의 세 가지 "표준" 파일이 열립니다 stderr
. Unix에서는 "파일 설명자"( stdin
=0, stdout
=1, =2)와 stderr
연결됩니다 . 기본적으로 세 가지 모두 터미널(화면에서 콘텐츠를 보고 프로그램에 입력을 입력하는 인터페이스)을 제어하는 장치와 연결되어 있습니다.
셸을 사용하면 파일 설명자를 "리디렉션"할 수 있습니다. 연산자는 >
출력을 리디렉션하고 <
입력을 리디렉션합니다.
예를 들어:
program_name > /dev/null
이는 다음과 같습니다.
program_name 1> /dev/null
파일 설명자 1('stdout')의 출력을 `/dev/null'로 리디렉션
같은,
program_name 2> /dev/null
파일 설명자 2('stderr')의 출력을 '/dev/null'로 리디렉션
리디렉션을 원할 수도 있습니다.둘 다 stdout
파일로 저장 stderr
하므로 다음과 같이 생각할 수도 있습니다.
program_name > /dev/null 2> /dev/null
그러나 이는 파일 설명자에 대한 인터리브 쓰기를 처리하지 않습니다(이에 대한 자세한 내용은 또 다른 질문입니다). 이 문제를 해결하려면 다음을 수행할 수 있습니다.
program_name > /dev/null 2>&1
이는 "파일 설명자 1에 대한 쓰기를 /dev/null
파일 설명자 2에 대한 쓰기가 리디렉션되는 위치로 리디렉션"을 의미합니다. 이는 파일 설명자에 대한 인터리브 쓰기를 처리합니다.
이 옵션은 매우 일반적이어서 일부 쉘에는 더 짧고 기능적으로 동일한 약어가 포함되어 있습니다.
program_name &> /dev/null
마지막으로 출력을 리디렉션하는 것처럼 입력을 리디렉션할 수 있습니다.
program_name < /dev/null
stdin
파일 설명자 0( )은 리디렉션되므로 /dev/null
프로그램이 입력을 읽으려고 하면 EOF를 받게 됩니다.
이 모든 것을 종합하면 다음과 같습니다.
program_name </dev/null &>/dev/null &
(1) 실행 program_name
, (2) 표준 입력을 /dev/null
( )에서 리디렉션, (3) 파일 설명자 1과 2( 및 )를 ( )로 리디렉션, (4) 백그라운드에서 프로그램을 실행( )한다고 가정합니다.</dev/null
stdout
stderr
/dev/null
&>/dev/null
&
답변2
> /dev/null을 사용하면 실제로 작업이 취소됩니다.
2>&1을 사용하면 오류 스트림 텍스트를 출력 스트림으로 리디렉션할 수 있습니다. 이는 누군가 실행 시 실제로 오류가 발생하는 명령을 실행하려고 시도할 때 가장 잘 이해됩니다. 명령을 있는 그대로 두 번 사용한 다음 2>&1을 사용하여 명령을 실행하십시오.
이것이 적어도 초보 사용자에게 도움이 되기를 바랍니다. 감사해요.