파이프를 사용하여 명령을 줄입니다.

파이프를 사용하여 명령을 줄입니다.

나는 Pipe( |)가 stdout을 서브쉘의 stdin으로 파이프하는 데 사용된다는 것을 배웠습니다.

그러나 명령에는 less파일 이름 매개변수가 있어야 합니다.less file1.txt

그러나 ls -l /root | less.

따라서 이 경우에는 시간이 더 적게 소요된다고 가정합니다.stdin 문서이는 의 표준 출력 에서 ls -l /root​​작성 되었습니다. 내 말은, 실제로 less stdin자신의 입찰이 적을 때를 의미합니다. 그런데 또 다른 명령 때문에 헷갈립니다. 이것은 tr명령입니다.

tr이 명령은 어떤 것도 허용하지 않습니다.문서인수 예 tr a-z A-Z file1.txt: 키보드에서 stdin을 가져오거나 stdin을 리디렉션합니다. 단, 주문은 ls -l /root | tr a-z A-Z가능합니다. 글쎄, 내 가정은 틀렸어.

파이프라인은 실제로 어떻게 작동하나요? 기본 원리는 파이프가 메인 쉘의 표준 출력을 서브 쉘의 표준 입력으로 전달한다는 것입니다. 하지만 메인 쉘의 표준 출력이 서브 쉘의 표준 입력으로 갈 것이라는 사실은 몰랐습니다.문서아니면 키보드로 문자를 입력해야 하는 상황일 수도 있습니다. 그러나 위의 예를 보면 쉘은 두 가지 경우를 모두 고려합니다.

답변1

나는 파이프(|)가 표준 출력을 서브셸의 표준 입력으로 전달하는 데 사용된다는 것을 배웠습니다.

왼쪽 명령 stdout을 오른쪽 명령 stdin으로 전달합니다. 이러한 명령 중 하나 또는 둘 다 하위 쉘에서 실행되는지 여부는 쉘 구현에 따라 다릅니다.

그럼에도 불구하고 쉘은 인수가 두 명령 중 하나에 전달되는지 여부를 신경 쓰지 않습니다. 프로그램은 표준 입력 및 표준 출력을 무시하는 것을 포함하여 적절하다고 판단되는 대로 작동할 수 있습니다.

tty또한 프로그램은 표준 입력이 대화형 키보드 인지 여부를 감지하고 그에 따라 작동할 수 있습니다. 이것은 less명령에서 관찰되는 것입니다. 인수가 주어지지 않으면 표준 입력은 일반적으로 읽혀지지만, 만약 그렇다면 처리를 거부합니다 tty.소스 코드보여주다:

  if (isatty(fd0))
  {
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
  }

답변2

그래서 저는 이 경우에는 less다음이 필요하다고 가정합니다.stdin 문서이는 의 표준 출력 에서 ls -l /root​​작성 되었습니다.

이는 정확하며 귀하가 관찰한 내용과 모순되지 않습니다 tr.

껍데기관로Construct()는 다음을 생성합니다.PRODUCER | CONSUMER익명 파이프프로세스 PRODUCERCONSUMER. 익명 파이프는 이름과 디렉터리 항목이 없지만 정상적으로 읽고 쓸 수 있는 파일 형식입니다. 파이프에서 쉘은 파이프의 쓰기 끝을 생산자의 표준 출력에 연결하고 파이프의 읽기 끝을 소비자의 표준 입력에 연결합니다.

tr명령은 stdin에서 데이터를 읽고 stdout에만 씁니다. less이 명령은 명령줄에 파일 이름을 전달하지 않은 경우에만 이 작업을 수행합니다. 파일 이름을 전달하면 less표준 입력이 아닌 이 파일에서 읽습니다. 수행되는 작업은 less파일에서 데이터를 읽는 많은 유사한 응용 프로그램에 따른 일반적인 규칙입니다.

당신도 옳을 수도 있습니다. . . 관심이 있다STDOUT과 STDIN을 연결한다는 것은 무엇을 의미합니까?그리고명령에 어떻게 여러 출력이 있을 수 있나요?

관련 정보