STDIN과 명령에 전달 된 인수의 차이점은 무엇입니까? 형식 중

두 형식 중 하나를 사용하여 cat메소드 를 실행할 수 있습니다 .

cat file_name
cat < file_name

결과는 같습니다

그런 다음 man형식으로 실행하고 싶습니다.stdin

man < file_name

file_name포함 하는 동안 :

# file_name
cat

그러나 What manual page do you want?execute 대신 팝업이 나타납니다
man cat.

나는 왜 논쟁으로 cat받아 들일 수는 stdin있지만 man할 수 없는지 알고 싶다 . 그리고 명령 행 인수와의 차이점은 무엇 stdin입니까?



답변

귀하의 질문은 사용중인 쉘이 명령 줄에서 사용자 입력을 구문 분석하는 방법과 밀접한 관련이 있습니다.

명령 행의 첫 번째 단어가 특수 폴더 (주로에 의해 정의 됨 PATH) 에있는 프로그램 이고 더 이상 특수 문자가 제공되지 않으면 (사용중인 쉘에 따라 다름) 공백이나 탭으로 구분 된 모든 후속 단어가 특별한 형태의 프로그램, 즉 배열. 배열에서 각 단어를 하나의 요소로 사용합니다.

프로그램이 호출하려고하는 인수가 배열에있는 인수를 해석하는 방법은 프로그래밍 방식에 따라 다릅니다. 인수의 구문이 어떻게 보이는지에 대한 준 표준이 있지만 일반적으로 프로그래머는 완전히 무료입니다. 따라서 첫 번째 인수는 파일 이름 또는 프로그래머가 프로그램을 작성할 당시에 생각한 모든 이름으로 해석 될 수 있습니다.

특수 문자를 추가 <하거나 >명령 행에 추가하는 경우 , 쉘 은 프로그램에 전달 될 배열에 추가 <>후속 단어를 추가 하지 않습니다. 으로 <또는 >기본 커널 (키워드가 지원하는 메이크업의 멋진 것들 쉘 시작, 주어진 배관 ). 무슨 일이 일어나고 있는지 파악하려면 무엇을 이해해야 STDIN하며 STDOUT(즉시 생략하지 않기 때문에 STDERR) 생략 해야합니다 .

터미널에서 볼 수있는 모든 것 (대부분의 경우 디스플레이의 일부)은 쉘 또는 이전에 호출 한 다른 프로그램에 의해 특수 파일에 작성됩니다 ( 유닉스에서는 모든 것이 파일 임). 이 파일에는 특수 ID가 있으며이라고 STDOUT합니다. 프로그램이 키보드에서 데이터를 읽으려면 키보드를 직접 폴링하지 않지만 () 대부분의 특수 파일에서 읽습니다 STDIN. 내부적으로이 파일은 대부분의 경우 키보드 인 표준 입력 장치에 연결됩니다.

쉘 이 구문 분석 된 명령 행을 읽 <거나 읽는 경우 해당 프로그램이 실행되는 시간 동안 특정 유형으로 >조작 STDIN하거나 조작 STDOUT합니다. STDINSTDOUT상기 단말 또는 이상이 아니라 커맨드 라인에서 이후에 파일명 표준 입력 장치 포인트 dosn’t.

두 줄의 경우

cat file_name
cat < file_name

해당 개발자가 파일에서 데이터를 읽거나 파일에서 데이터를 읽 cat도록 하기 때문에 관찰 된 동작은 동일 STDIN합니다. 이름은 첫 번째 명령 행 인수 (쉘이 전달하는 배열의 첫 번째 요소 cat)로 지정됩니다. 이후 cat의 전체 내용 기록 file_name또는 STDIN우리는 쉘이 조작 지시하지 않기 때문에 터미널을 STDOUT. 두 번째 줄 STDIN에서 쉘 은 이런 방식으로 조작 하므로 더 이상 표준 입력 장치를 가리키는 것이 아니라 file_name현재 작업 디렉토리에서 호출되는 파일을 가리 킵니다 .

라인의 다른 경우

man < file_name

manSTDIN빈 배열과 같이 인수없이 호출 된 경우 아무것도 읽지 않습니다 . 그래서 라인

man < file_name

같다

man

예를 들어 man뭔가를 읽 STDIN당신이 통과도 경우 -l -man. 명령 행에이 옵션을 사용하면 터미널 man에서 읽은 내용을 표시 할 수 있습니다 STDIN. 그래서

man -l - < file_name

작동하지만 페이지 man호출기뿐만 아니라 파일의 입력을 구문 분석하여 파일 내용과 표시된 내용이 다를 수 있습니다.

따라서 STDIN, STDOUT및 명령 행 인수가 해석되는 방법은 모두 해당 개발자의 책임입니다.

내 대답으로 문제를 해결할 수 있기를 바랍니다.


답변

그들은 완전히 다릅니다. 명령 행 인수는 배열로 프로그램에 전달되며 원하는대로 수행 할 수 있습니다. stdin은 프로그램이 데이터를 요청해야하는 입력 스트림입니다. 파일을 처리하는 프로그램은 종종 두 가지를 모두 지원하도록 선택하지만 수동으로 수행해야합니다. 파일 이름이 명령 줄 인수로 전달되었는지, 대신 stdin에서 읽지 않은지 확인합니다.

당신이 기대하는 것 같다 man정말 이상한 행동 것이다 그것을 표시해야 매뉴얼 페이지를 찾기 위해 표준 입력을 읽을; 언제 사용하겠습니까? catstdin 을 표시하는 사실은 다른 작업을 수행하지 않는다는 사실입니다. 다른 도구는 그렇게 작동하지 않는다고 생각합니다. 예를 들어, grep파일 이름을 가져 오거나에서 읽을 수 stdin있지만의 데이터를 처리하지만 stdin에서 파일 이름을 읽지 않습니다.stdin 다음 열지 않습니다.

이 동작이 실제로 필요한 경우 xargs파일을 명령 줄 인수로 변환하는을 사용할 수 있습니다 .

$ xargs man < file_name

또는 cat통화 내에 통화를 포함 man하십시오.

$ man $(cat file_name)


답변