일부 명령이 입력 리디렉션을 사용하지 않는 이유는 무엇입니까?


4

예를 들어 echo :

[aesteban@localhost ~]$ cat tmp.txt 
Angel
[aesteban@localhost ~]$ echo < tmp.txt

[aesteban@localhost ~]$

보다시피, 출력은 단지 빈 줄입니다. 내 독서에 따르면 일부 명령은 입력 리디렉션을 취할 수 있습니다 (예 : mail) .

[aesteban@localhost ~]$ mail barney@example.com < tmp.txt 

입력 리디렉션은 대화 형 명령 (입력을 기다릴 수있는 명령)에만 적용됩니까? 명령이 대화식인지 아닌지를 어떻게 판단합니까?

답변:


3

일부 명령이 입력 리디렉션을 사용하지 않는 이유는 무엇입니까?

짧은 대답 : 그들은 프로그래밍되지 않았기 때문입니다.

읽을 프로그램 stdin(이후에 지정된 파일에 쉘이 연결하는 스트림 <)은 자동이 아닙니다. 프로그래머가 코딩해야합니다. 이 문제를 해결하기 위해 명령 줄에 지정된 파일을 읽는 것도 자동이 아닙니다. 즉, 경로 재 지정 또는 이름으로 지정된 파일의 내용은 추가 코딩없이 프로그램 변수 내에 마술처럼 나타나지 않습니다.

프로그램이 스트림에서 읽도록 코딩되지 않은 경우 리디렉션을 넣었는지 여부는 중요하지 않으며 단순히 읽지 않습니다. POSIX 사양 ( http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html )에 echo따라 읽을 필요는 없으며 stdin명령 줄 인수 (및 일부 환경 변수) 만 검사합니다. 다른 프로그램을 찾으려면 소스 코드, 설명서를 읽거나 간단히 말해서 시도해보십시오.

마지막 질문에 대답하려면 명령이 대화식이라고 말할 수는 없습니다. 읽고있는 입력 스트림이 터미널 (예 : 일반 파일)과 연결되어 있는지 여부 확인할 수 있습니다 . http://rosettacode.org/wiki/Check_input_device_is_a_terminal 에 여러 언어로 된 예제가 있습니다 . 이 기능을 사용하여 대화식으로 사용되는지 (키보드 명령을 사용하여 메일을 읽는지) 또는 비 대화식으로 (예 : 파일에서 메일 메시지를 읽는지) 판별하는 메일 링 프로그램을 생각할 수 있습니다. 잘 모르겠습니다 mail. ( mail명령 줄 인수를 사용하거나 사용하지 않고 호출 할 때 다르게 동작합니다!)


1

명령 행에 이름이 지정된 파일의 내용을 읽는 대부분의 명령은 명령 행에 파일이 지정되지 않은 경우 표준 입력에서 읽습니다. 파일 이름이 - 명령 줄에 지정된 경우 일부는 표준 입력에서 읽습니다 . 예를 들어

고양이 파일 1  -  파일 2

에서 읽은 다음 표준 입력 을 읽습니다 . 그러나 명령이 일반적으로 명령 줄에 이름이 지정된 파일의 내용을 읽지 않으면 표준 입력으로도 아무 작업도 수행하지 않습니다.  파일에서 읽지 않습니다.file1file2echo

물론 다양한 예외가 있습니다.

  • tr명령은 항상 표준 입력에서 읽고, 명령 줄에서 파일 이름 (들)을 허용하지 않습니다.
  • 경우 bc파일 이름 인수 (들)를 호출, 그것은 그들을 읽고, 다음 또한 파일 (들) 중 하나가하지 않는 한, 표준 입력을 읽 halt거나 quit명령을 사용합니다.
  • 컴파일러 (예 : cc또는 로 호출 될 수있는 C 컴파일러 gcc)는 명령 줄에서 파일 이름을 요구하는 경향이 있습니다.  cc명령 행에서 파일 이름없이 호출하면 실패합니다.  cc -특정 옵션이 지정된 경우에만 표준 입력을 읽습니다.
  • 입력 소스가 두 개 미만 cmp이거나 호출이 이치에 맞지 않습니다 diff. 명령 행에서 파일 이름없이 호출하면 실패합니다. 둘 다 인수가 -표준 입력 을 지정 한다는 규칙을 존중합니다 .  동등하다 ; 즉, 표준 입력 과 비교 됩니다.  하나의 파일 이름 인수로 호출하면 실패합니다. 당신은 말할 필요가있을 것 입니다.cmp file1cmp file1 -file1diffdiff file1 -
  • 그리고, 동안 ddaccept를합니다 I의 nput의 f를 가로 표시되는 경우 명령 줄에 지정된 ILE을 예를 들면,if=filename

    dd if=my_iso_file of=/dev/sda1

    ( of이다 O를 utput F ILE), 당신은 어떤을 지정하지 않은 경우 표준 입력에서 읽습니다 if; 예를 들어

    dd of=/dev/sda1 < my_iso_file

    그것은 허용하지 않는 명령 줄 인수 입니다 꾸밈 파일 이름 (예를 들어, 정도, dd my_iso_file > /dev/sda1그리고 dd my_iso_file of=/dev/sda1 않습니다 하지 작업). 또한 파일에서 읽는 대부분의 명령과 달리 dd명령 줄에서 둘 이상의 입력 파일을 처리하지 않습니다.

(아마도 다른 사람들이있을 수 있습니다.)


기술적으로 파일을 dd다음 으로 리디렉션 할 수 있습니다 .dd status=none < /proc/uptime
Steven

0

설명서를 읽으십시오.

echo 명령은 stdin에서 읽지 않습니다. 따라서 입력 리디렉션은 아무 것도 수행하지 않습니다. 배쉬 매뉴얼 상태 :

echo : 공백으로 구분 된 개행 문자와 그 뒤에 개행을 출력합니다.

에 대한 맨 페이지 cat:

cat-파일을 연결하고 표준 출력에 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.