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합니다. STDIN및 STDOUT상기 단말 또는 이상이 아니라 커맨드 라인에서 이후에 파일명 표준 입력 장치 포인트 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_name은 man해석 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.