UNIX 철학은 다음과 같이 말합니다: 한 가지 일을 하고 그것을 잘 수행하십시오. 이것이 일반적인 인터페이스이기 때문에 텍스트를 처리하는 프로그램을 작성하십시오.
명령 sort
(적어도 GNU 정렬)에는 -o
대신 파일로 출력하는 옵션이 있습니다 stdout
. sort foobar -o whatever
가능하다면 이것이 왜 유용한가요 sort foobar > whatever
?
답변1
이를 갖고 있는 것은 GNU 클래스만이 아닙니다. BSD 정렬에도 있습니다. 왜?
(이 질문도 좋은 질문인 것 같아요...)
매뉴얼 페이지에서: "주어진 인수는 표준 출력이 아닌 사용할 출력 파일의 이름입니다. 파일은 입력 파일 중 하나와 동일할 수 있습니다."
리디렉션을 통해 동일한 파일로 이동할 수 없으며, 출력 리디렉션으로 인해 파일이 지워집니다.
좀 더 명확하게 설명하자면, 파일을 정렬하고 정렬된 결과를 같은 위치에 두고 싶다면 그렇게 하는 것을 고려해 볼 수 있습니다 sort < foo > foo
. 단, 출력 리디렉션은 foo
출력 수신을 준비하기 위해 파일을 자릅니다 . 그러면 정리할 것이 없습니다. "-o" 없이 수행하는 방법은 입니다 sort < foo > bar ; mv bar foo
. 이 -o
옵션은 걱정할 필요 없이 비슷한 작업을 수행할 것이라고 생각합니다 .
답변2
'-o' 옵션이 이미 sort
포함되어 있습니다.유닉스 버전 6
하지만 나는 당신의 의견에 동의합니다. 그것은 유닉스 철학의 일부가 아닙니다. uniq
그 옵션은 없었습니다( 그때도 sort
없었습니다 -u
).
내 PDP-11에서는 하나의 매개변수를 취하는 작은 프로그램을 사용합니다.
renac whatever
이미 존재하는 경우 whatever
stdin의 모든 내용을 임시 파일에 기록하며, whatever
stdin 입력이 소진될 때만 이름이 변경됩니다. 이를 통해 renac
입력을 덮어쓰지 않고 파일 이름으로 리디렉션하는 대신 명령의 출력을 파이프할 수 있습니다 . 이러한 방식으로 적용 범위 문제를 해결하는 것은 IMHO가 Unix 철학과 더 일치합니다.
나중에 프로그램에 추가된 사항은 다음과 같습니다: 표준 입력에 아무것도 없는 경우(예: 명령줄 섹션의 오타로 인해) 출력 파일을 덮어쓰지 않고, 지정된 파일에 표준 입력을 추가하는 옵션을 허용합니다.
이것은 제가 만든 최초의 실제 C 프로그램입니다(저는 작업을 위해 주로 이 시스템에서 파스칼로 개발합니다).