귀하의 질문은 사용중인 쉘이 명령 줄에서 사용자 입력을 구문 분석하는 방법과 밀접한 관련이 있습니다.
명령 행의 첫 번째 단어가 특수 폴더 (주로에 의해 정의 됨 PATH
) 에있는 프로그램 이고 더 이상 특수 문자가 제공되지 않으면 (사용중인 쉘에 따라 다름) 공백이나 탭으로 구분 된 모든 후속 단어가 특별한 형태의 프로그램, 즉 배열. 배열에서 각 단어를 하나의 요소로 사용합니다.
프로그램이 호출하려고하는 인수가 배열에있는 인수를 해석하는 방법은 프로그래밍 방식에 따라 다릅니다. 인수의 구문이 어떻게 보이는지에 대한 준 표준이 있지만 일반적으로 프로그래머는 완전히 무료입니다. 따라서 첫 번째 인수는 파일 이름 또는 프로그래머가 프로그램을 작성할 당시에 생각한 모든 이름으로 해석 될 수 있습니다.
특수 문자를 추가 <
하거나 >
명령 행에 추가하는 경우 , 쉘 은 프로그램에 전달 될 배열에 추가 <
및 >
후속 단어를 추가 하지 않습니다. 으로 <
또는 >
기본 커널 (키워드가 지원하는 메이크업의 멋진 것들 쉘 시작, 주어진 배관 ). 무슨 일이 일어나고 있는지 파악하려면 무엇을 이해해야 STDIN
하며 STDOUT
(즉시 생략하지 않기 때문에 STDERR
) 생략 해야합니다 .
터미널에서 볼 수있는 모든 것 (대부분의 경우 디스플레이의 일부)은 쉘 또는 이전에 호출 한 다른 프로그램에 의해 특수 파일에 작성됩니다 ( 유닉스에서는 모든 것이 파일 임). 이 파일에는 특수 ID가 있으며이라고 STDOUT
합니다. 프로그램이 키보드에서 데이터를 읽으려면 키보드를 직접 폴링하지 않지만 () 대부분의 특수 파일에서 읽습니다 STDIN
. 내부적으로이 파일은 대부분의 경우 키보드 인 표준 입력 장치에 연결됩니다.
쉘 이 구문 분석 된 명령 행을 읽 <
거나 읽는 경우 해당 프로그램이 실행되는 시간 동안 특정 유형으로 >
조작 STDIN
하거나 조작 STDOUT
합니다. STDIN
및 STDOUT
상기 단말 또는 이상이 아니라 커맨드 라인에서 이후에 파일명 표준 입력 장치 포인트 dosn't.
두 줄의 경우
cat file_name
cat < file_name
해당 개발자가 파일에서 데이터를 읽거나 파일에서 데이터를 읽 cat
도록 하기 때문에 관찰 된 동작은 동일 STDIN
합니다. 이름은 첫 번째 명령 행 인수 (쉘이 전달하는 배열의 첫 번째 요소 cat
)로 지정됩니다. 이후 cat
의 전체 내용 기록 file_name
또는 STDIN
우리는 쉘이 조작 지시하지 않기 때문에 터미널을 STDOUT
. 두 번째 줄 STDIN
에서 쉘 은 이런 방식으로 조작 하므로 더 이상 표준 입력 장치를 가리키는 것이 아니라 file_name
현재 작업 디렉토리에서 호출되는 파일을 가리 킵니다 .
라인의 다른 경우
man < file_name
man
STDIN
빈 배열과 같이 인수없이 호출 된 경우 아무것도 읽지 않습니다 . 그래서 라인
man < file_name
같다
man
예를 들어 man
뭔가를 읽 STDIN
당신이 통과도 경우 -l -
에 man
. 명령 행에이 옵션을 사용하면 터미널 man
에서 읽은 내용을 표시 할 수 있습니다 STDIN
. 그래서
man -l - < file_name
작동하지만 페이지 man
호출기뿐만 아니라 파일의 입력을 구문 분석하여 파일 내용과 표시된 내용이 다를 수 있습니다.
따라서 STDIN
, STDOUT
및 명령 행 인수가 해석되는 방법은 모두 해당 개발자의 책임입니다.
내 대답으로 문제를 해결할 수 있기를 바랍니다.
man -l - < file_name
은man
해석STDIN
으로 논쟁 을하는 데 사용 한다고 언급 했지만 내 시스템에서는STDERR
다음 과 같이 실패합니다 .man -l - < tee man: invalid option -- l man, version 1.6c