나는 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
익명 파이프프로세스 PRODUCER
와 CONSUMER
. 익명 파이프는 이름과 디렉터리 항목이 없지만 정상적으로 읽고 쓸 수 있는 파일 형식입니다. 파이프에서 쉘은 파이프의 쓰기 끝을 생산자의 표준 출력에 연결하고 파이프의 읽기 끝을 소비자의 표준 입력에 연결합니다.
이 tr
명령은 stdin에서 데이터를 읽고 stdout에만 씁니다. less
이 명령은 명령줄에 파일 이름을 전달하지 않은 경우에만 이 작업을 수행합니다. 파일 이름을 전달하면 less
표준 입력이 아닌 이 파일에서 읽습니다. 수행되는 작업은 less
파일에서 데이터를 읽는 많은 유사한 응용 프로그램에 따른 일반적인 규칙입니다.
당신도 옳을 수도 있습니다. . . 관심이 있다STDOUT과 STDIN을 연결한다는 것은 무엇을 의미합니까?그리고명령에 어떻게 여러 출력이 있을 수 있나요?