STDOUT으로 인쇄하는 것과 출력 파일에 직접 쓰는 것 [닫기]

STDOUT으로 인쇄하는 것과 출력 파일에 직접 쓰는 것 [닫기]

프로그램의 결과가 기본적으로 표준 출력으로 인쇄되어야 하는 경우와 출력 파일을 인수 중 하나로 받아들이고 이에 쓰는 것이 더 적절한 접근 방식인 경우 경험에 따른 규칙이 있습니까? 언제든지 표준 출력을 파일로 리디렉션할 수 있습니다.

나는 다른 프로그램이 있다는 것을 알고 있습니다. 예를 들어 결과가 단일 파일이 아닌 여러 파일인 경우 stdout으로 인쇄하는 것은 의미가 없습니다. 프로그램의 출력이 일시적인 경우 출력 파일을 인수로 받아들이는 것도 의미가 없습니다.

그러나 궁극적으로 단일 파일에 배치되어야 하는 출력을 생성하는 프로그램은 어떻습니까? 이러한 프로그램은 stdin에서 입력을 받는 프로그램과 인수에서 입력을 받는 프로그램으로 더 나눌 수 있습니다.

답변1

몇 가지 실제 예:


출력을 stdout으로 보내는 애플리케이션은 일반적으로 애플리케이션이 제대로 작동하고 있음을 의미합니다.어떤 유형수신자에게는 파이프나 소켓에서도 작동하는 데이터 스트림을 보냅니다. 이것이 유닉스 파이프의 특성이다.만약에경험상 법칙이 있다면 아마도 이것이 가장 좋은 후보일 것입니다.


반면에 -o <output-file-name>애플리케이션이 선호하는 경우필요그 출력을 구합니다.

물론 lseek(2)표준 출력을 무시할 수도 있지만(실제로 검색 가능한 경우) 이는 일반적으로 예상치 못한 동작입니다.

물론 입력에도 동일하게 적용됩니다.


파일에서/파일로 리디렉션하려면 쉘이 필요합니다. 쉘이 없어도 특수 옵션 매개변수가 허용됩니다.


파일에서/로 리디렉션하면 파일 위치(찾을 수 있는 경우) 또는 여러 응용 프로그램 간의 파이프/소켓 연결을 쉽게 공유할 수 있습니다. 이는 쉘 스크립팅에서 유용한 기능이 될 수 있습니다. 예를 들면 다음과 같습니다.

{
    echo hello world
    head -c 10
    seq 10 | awk '{print "amazing text-manipulation of", $0}'
    dd bs=1024 count=1 seek=32
    echo farewell
} < /dev/random > recipient-file

-o recipient-file옵션(또는 ) 에만 의존하는 것은 -i /dev/random(그렇게 쉽게) 허용되지 않습니다.


어떤 경우에는 위의 내용과 반대되는 경우도 있습니다. -o <output-file-name>옵션을 사용하면 애플리케이션의 출력이 생성될 수 있습니다.아니요다른 응용 프로그램과 공유할 때 표준 출력이 오염됩니다. 예:

strace -o prog.strace output-producer > prog.output

입력, 소유 애플리케이션도 마찬가지입니다.아니요공유 표준 입력을 사용하십시오.

unwanted-consumer -i /dev/null desired-consumer

stdin/stdout에만 의존하려면 다음과 같은 추가 셸 계층이 필요합니다.

strace > prog.strace sh -c 'output-producer > prog.output'

또는 표준 입력의 경우:

unwanted-consumer 3<&0 < /dev/null sh -c 'desired-consumer <&3'

명령의 간결성/간결성 및 쉘의 필요성 외에도 쉘 호출에는 대상으로 삼 output-producer거나 조정 해야 할 수 있는 약간 다른 환경이 포함되어 desired-consumer전체적인 부담이 가중됩니다.

답변2

프로그램의 출력이 다른 프로그램의 입력으로 사용되고 출력이 기본적으로 텍스트인 경우 stdout을 기본값으로 설정하면 프로그램을 파이프라인의 일부로 쉽게 사용할 수 있습니다.

반면에 출력이 일반적으로 바이너리이거나 매우 큰 경우(주어진 입력에 비해) 기본적으로 파일 이름을 요청하고 명시적으로 요청하지 않는 한 터미널에서 인쇄를 거부하는 것이 합리적입니다.

첫 번째 그룹의 경우, 다른 프로그램을 공급하는 파이프라인의 일부로서 뿐만 아니라 사용자가 직접 읽을 수 있는 출력을 제공하는 데에도 똑같이 유효한 grep, sort, 등을 고려하세요. cut거의 모든 사람들이 표준 출력으로 인쇄하고 원하는 경우 출력을 파일로 리디렉션할 수 있다는 것을 알고 있습니다.

convert두 번째로는 이미지 파일을 변환하고 처리할 수 있는 ImageMagick을 예로 들 수 있습니다 . 명령줄에서 입력 및 출력 파일 이름을 가져옵니다. 여기에서는 이미지 파일이 파이프라인의 일부로 거의 사용되지 않으며 실제로 JPEG 또는 PNG를 터미널에 덤프하고 싶지 않으므로 여기서는 그렇게 하는 것이 합리적입니다.

-파일 이름 인수를 사용할 때 이를 기록한다면 stdin 또는 stdout을 사용하는 것이 더 좋습니다 . 이것은 매우 일반적인 습관이며 사용자가 유사한 것을 사용하지 않아도 됩니다 /dev/stdin. (일부 시스템에서는 실패할 수 있습니다.)

다른 도구가 하는 일을 하는 것이 놀라움의 여지를 남기지 않기 때문에 좋습니다. 물론, 사용 사례가 충분히 달라서 다른 사용 사례를 복사할 필요가 없는 경우는 제외됩니다.

관련 정보