한 프로그램의 표준 입력을 다른 프로그램에 매개변수로 전달하는 방법은 무엇입니까?

한 프로그램의 표준 입력을 다른 프로그램에 매개변수로 전달하는 방법은 무엇입니까?

입력 파일과 출력 파일이라는 두 개의 매개변수를 사용하는 프로그램이 있다고 가정합니다.

이 출력 파일을 디스크에 저장하지 않고 다른 프로그램에 직접 전달하려면 stdin어떻게 해야 합니까 ? 이것을 달성할 수 있는 방법이 있나요?

Linux에서 접한 많은 명령은 위에서 지정한 작업을 수행하는 출력 파일 인수로 "-"를 전달하는 옵션을 제공합니다. stdin프로그램을 매개변수로 전달할 수 없기 때문인가요 ? 그렇다면 우리는 어떻게 해야 합니까?

이미징에 사용하는 방법의 예는 다음과 같습니다.

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)

제가 사용하는 쉘은 bash입니다.

답변1

프로그램이 파일 설명자에 대한 쓰기를 지원하는 경우 해당 파일 설명자를 찾을 수 없더라도 해당 파일 설명자를 /dev/stdout출력 파일로 사용할 수 있습니다. 이것은 /proc/self/fd/1내 시스템의 심볼릭 링크입니다. 파일 설명자 1은 표준 출력입니다.

답변2

pdftotext매뉴얼 페이지 에서 :

텍스트 파일이 "-"이면 텍스트가 표준 출력으로 전송됩니다.

따라서 이 경우 필요한 것은 다음과 같습니다.

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" -

또는 다른 프로그램의 STDIN으로 파이프하려는 경우:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" - | another_prog

대체 파일 이름을 사용하는 것은 STDIN에서 입력하거나 STDOUT으로 출력해야 할 때 -pdftotext를 포함한 많은 유틸리티에서 따르는 규칙입니다 . 그러나 모든 유틸리티가 이 규칙을 따르는 것은 아닙니다. 이 경우 bash에서 이를 수행하는 관용적 방법은 다음을 사용하는 것입니다.프로세스 교체:

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( cat )

여기서의 동작은 >( )파일이 에 전달되는 것과 거의 유사 my_utility하지만 스트림은 실제로 파일이 아니지만 포함 프로세스(예: cat)의 표준 입력으로 파이프됩니다. 따라서 여기에서는 최종적으로 필요에 따라 텍스트가 출력되어야 합니다.

cat사용UUOC 알람 벨이 울립니다.그런 포럼에서. 유틸리티가 이를 지원하지 않는 경우 -이것이 유용한 용도라고 생각 cat하지만, 이 프로세스를 사용하지 않고 교체할 수 있는 방법이 있다면 cat모두 귀를 기울일 것입니다 ;-).

그러나 (질문에 나와 있듯이) 스트림의 최종 대상이 다른 프로그램의 STDIN인 경우 이를 cat제거할 수 있습니다.

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( another_prog )

답변3

쉘이 이를 지원하는 경우 이와 같은 작업을 수행하는 가장 쉬운 방법은 다음을 사용하는 것입니다.프로세스 교체: <(…)그리고 >(…). 이는 bash, zsh, ksh 및 기타 쉘에도 적용됩니다. 예를 들어:

$ sort <(printf "b\nc\na\n")
a
b
c
$ ls
foo
$ cp <(find . -name foo) bar
$ ls
bar  foo

pdftotext그러나 이것은 텍스트 파일에 저장되기 때문에 여러분이 말하는 예제에는 도움이 되지 않습니다 . 가장 좋은 옵션은 (명백한 사용 외에 -) @TiCPU의 제안을 따르는 것이지만 /dev/stdout다른 쉘 기능을 사용할 수도 있습니다. 이 구성은 !:N이전 명령의 N번째 매개변수를 참조합니다. 따라서 다음을 수행할 수 있습니다.

$ pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"  out.txt
$ cat !:2

답변4

cmd tty

tty연결된 터미널의 이름을 반환합니다 stdout.

관련 정보