입력 파일과 출력 파일이라는 두 개의 매개변수를 사용하는 프로그램이 있다고 가정합니다.
이 출력 파일을 디스크에 저장하지 않고 다른 프로그램에 직접 전달하려면 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
.