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

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

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

cat file_name
cat < file_name

결과는 같습니다

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

man < file_name

또한 다음이 file_name포함됩니다:

# file_name
cat

What manual page do you want?하지만 실행하는 대신 팝업이 나타납니다 man cat.

매개변수로 cat허용되는데 왜 허용되지 않는지 알고 싶습니다 . 명령줄 매개변수와 의 차이점은 무엇입니까 ?stdinmanstdin

답변1

문제는 사용 중인 셸이 명령줄에서 사용자 입력을 구문 분석하는 방식과 밀접하게 관련되어 있습니다.

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

호출하는 프로그램이 매개변수(배열에 있음)를 해석하는 방법은 프로그래밍 방법에 따라 다릅니다. 매개변수의 구문이 어떻게 생겼는지에 대한 몇 가지 준표준이 있지만 일반적으로 프로그래머는 완전히 무료입니다. 따라서 첫 번째 매개변수는 파일 이름이나 프로그래머가 프로그램을 작성할 때 생각한 대로 해석될 수 있습니다.

<특수 문자를 추가 하거나 >명령줄에 추가하면 쉘은 프로그램에 전달될 배열 <에 후속 단어를 추가하지 않습니다. 또는 주어진 값을 >사용하면 쉘은 기본 커널(키워드)에서 지원하는 멋진 것들을 만들기 시작합니다.<>관로). 무슨 일이 일어나고 있는지 파악하려면 STDINSTDOUT(즉시 관련이 없으므로 생략합니다 STDERR)이 무엇인지 이해해야 합니다 .

터미널에서 볼 수 있는 모든 것(그리고 대부분의 경우 디스플레이의 일부)은 특수 파일(유닉스의 모든 것은 파일이다). 이 파일에는 이라는 특수 ID가 있습니다 STDOUT. 프로그램이 키보드에서 데이터를 읽으려는 경우(적어도 대부분의 경우) 키보드를 직접 폴링하지 않고 대신 STDIN내부적으로 파일이 연결됩니다. 표준 입력 장치(대부분의 경우 키보드)

쉘이 구문 분석된 명령줄에서 OR를 읽으면 <해당 프로그램이 실행될 때 특정 유형에 대해 OR을 수행합니다. 더 이상 터미널이나 표준 입력 장치를 가리키지 않고 명령줄의 후속 파일 이름을 가리킵니다.>STDINSTDOUTSTDINSTDOUT

2줄의 경우

cat file_name
cat < file_name

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

다른 라인의 경우

man < file_name

manSTDIN매개변수 없이(즉, 빈 배열) 호출하면 아무것도 읽히지 않습니다. 그래서 이 줄은

man < file_name

동일한

man

예를 들어 에 전달하면 man에서 내용도 읽게 됩니다. 명령줄에 이 옵션을 제공하면 터미널에서 읽은 모든 내용을 표시할 수 있습니다. 그래서STDIN-l -manmanSTDIN

man -l - < file_name

man작동할 수도 있습니다(단 , 단순한 호출기가 아니라 파일의 입력을 구문 분석하므로 파일 내용과 표시되는 내용이 다를 수 있으므로 주의하세요 ).

STDIN따라서 , 및 명령줄 인수를 해석하는 방법은 STDOUT전적으로 해당 개발자에게 달려 있습니다.

내 대답으로 상황이 명확해지기를 바랍니다.

답변2

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

man당신은 표시해야 할 매뉴얼 페이지를 찾기 위해 stdin을 읽을 것으로 기대하는 것 같습니다. 이는 언제 사용합니까? 표준 입력을 표시한다는 사실은 cat다른 어떤 도구도 이와 같이 작동하지 않는다는 사실의 인공물입니다. 예를 들어 grep파일 이름을 가져오거나 파일에서 읽을 수는 있지만 stdin해당 파일의 데이터를 처리 stdin하고 파일 이름을 읽은 stdin다음 열지는 않습니다.

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

$ xargs man < file_name

아니면 통화 cat내에 통화를 삽입 하세요 man.

$ man $(cat file_name)

관련 정보