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


16

두 형식 중 하나를 사용하여 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입니까?

답변:


21

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

명령 행의 첫 번째 단어가 특수 폴더 (주로에 의해 정의 됨 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및 명령 행 인수가 해석되는 방법은 모두 해당 개발자의 책임입니다.

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


이 자세한 설명에 감사드립니다. 마지막 몇 단락에서, 당신 man -l - < file_nameman해석 STDIN으로 논쟁 을하는 데 사용 한다고 언급 했지만 내 시스템에서는 STDERR다음 과 같이 실패합니다 .man -l - < tee man: invalid option -- l man, version 1.6c
steveyang

천만에요. 하지만 난 적어도 내 버전 언급하지 않았다 man( 사람-DB가 )에서 인수를 읽어 STDIN지정된 인수와 -l다음 -. 단지 STDIN매뉴얼 페이지의 데이터를 해석 합니다. 유효한 인수와 그 해석 방법에 대한 자세한 설명은 관련 프로그램의 매뉴얼 페이지를 참조하십시오. 귀하의 경우에 문의하십시오 man man. 에 대한 비슷한 옵션이있을 수 있습니다 man. STDIN xargs(위에서 언급 한 것처럼) 특정 프로그램에 대한 명령 행 인수를 읽으려면 가는 방법입니다.
user1146332

나는 man man내 OS에서 지원하지 않는 것을 발견했습니다. 어쨌든,이 두 가지 개념을 선언 해 주셔서 감사합니다.
steveyang

귀하의 답변을 편집하여 lmgtfy 대신 실제로 유용한 링크가 포함되었습니다. lmgtfy 링크를 게시하는 것은 1) 무례하고 2) 도움이되지 않으며 3) SE 사이트에서 실제로 눈살을 찌푸 렸습니다 . 링크를 제공하든 그렇지 않든, 그렇게하기로 선택한 경우, 누군가에게 정보를 찾는 방법을 보여주는 비꼬는 방법이 아니라 실제 정보에 대한 링크를 제공하십시오.
terdon

12

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

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

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

$ xargs man < file_name

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

$ man $(cat file_name)

bash에서는을 사용할 수 있습니다 man $(<file_name).
jordanm

다시 : "나는 다른 도구가 그런 식으로 작동하지 않습니다"-펄 (<>)은 루프에서 STDIN또는 파일 이름으로 명령 줄 인수를 수행합니다 ...
Aaron D. Marasco

@ AaronD.Marasco 나는 어떤 도구도 인수를 취하거나 stdin에서 파일 이름을 읽거나 해당 파일에서 인수를 읽지 않음을 의미했습니다
Michael Mrozek

@MichaelMrozek이 설명을 해주셔서 감사합니다. 내가 사용한 목적 man < file_name은이 두 가지 개념을 이해하도록 돕는 것입니다. 설명을 읽으면 구현은 명령 작성자가 결정합니다. 따라서 오른쪽 아래에서 findtake 인수는 오히려 STDIN을 처리합니까?
steveyang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.