UNIX 철학은 다음과 같이 말합니다: 한 가지 일을 하고 그것을 잘 수행하십시오. 범용 인터페이스이기 때문에 텍스트를 처리하는 프로그램을 만드십시오.
sort
적어도 GNU sort 명령 -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
sort
'-o' 옵션 은 이미유닉스 제6판
그러나 나는 이것이 유닉스 철학에 속하지 않는다는 점에 동의합니다. uniq
해당 옵션이 없었습니다(그리고 당시 sort
도 없었습니다 -u
).
내 PDP-11에서는 하나의 매개변수를 취하는 작은 프로그램을 사용했습니다.
renac whatever
이미 존재하는 경우 whatever
stdin의 모든 내용을 임시 파일에 기록하며 whatever
stdin 입력이 건조된 후에만 이름이 변경됩니다. 이렇게 하면 renac
입력을 덮어쓸 가능성 없이 파일 이름으로 리디렉션하는 대신 명령의 출력을 파이프로 연결할 수 있습니다 . 그런 식으로 덮어쓰기 문제를 해결하는 것은 IMHO가 Unix 철학을 더 잘 따르는 것입니다.
나중에 프로그램에 추가된 사항은 stdin에 아무것도 도착하지 않은 경우(예: 명령줄의 일부를 잘못 입력한 결과) 출력 파일을 덮어쓰지 않고 명명된 파일에 stdin을 추가하는 옵션을 허용하는 것입니다.
이것은 제가 만든 최초의 (처음은 아닐지라도) 실제 C 프로그램 중 하나였습니다(저는 주로 해당 시스템에서 Pascal로 개발했습니다).