유닉스 철학은 말합니다 : 한 가지 일만하고 잘하십시오. 범용 인터페이스이므로 텍스트를 처리하는 프로그램을 만드십시오.
sort
명령은, 적어도 GNU 정렬에서가 -o
대신 파일로 출력 옵션을 stdout
. 내가 왜 sort foobar -o whatever
할 수있을 때 유용한가 sort foobar > whatever
?
유닉스 철학은 말합니다 : 한 가지 일만하고 잘하십시오. 범용 인터페이스이므로 텍스트를 처리하는 프로그램을 만드십시오.
sort
명령은, 적어도 GNU 정렬에서가 -o
대신 파일로 출력 옵션을 stdout
. 내가 왜 sort foobar -o whatever
할 수있을 때 유용한가 sort foobar > whatever
?
답변:
그것은 단지 GNU 정렬이 아닙니다. BSD 정렬도 있습니다. 그리고 왜?
(나는 그것이 좋은 질문이라고 생각했다 ...)
매뉴얼 페이지에서 : "주어진 인수는 표준 출력 대신 사용할 출력 파일 이름입니다.이 파일은 입력 파일 중 하나와 동일 할 수 있습니다."
리디렉션을 사용하여 동일한 파일로 이동할 수 없으면 출력 리디렉션이 파일을 지 웁니다.
더 명확히하기 위해 파일을 정렬하고 정렬 된 결과를 같은 장소에 넣으려면 시도해 볼 수도 있습니다 sort < foo > foo
. 출력 경로 재 지정을 제외하고 출력 foo
수신 준비 파일 이 잘립니다 . 그리고 정렬 할 것이 없습니다. "-o"가 없으면 할 수있는 방법 sort < foo > bar ; mv bar foo
입니다. 나는 -o
옵션이 당신이 걱정할 필요없이 비슷한 것을한다고 가정합니다 .
sudo sort -o /some/place
이 아닌 privleged 사용자가 쓰기 권한을 가지고 있지 않습니다.
sponge
(moreutils의 일부)가 있습니다. 권한있는 리디렉션의 경우에는 파이핑이 있으며 | sudo tee
, 권한 상승을 단일 간단한 프로그램으로 제한하는 이점도 tee
있습니다.
-o
옵션 이지만 sort
. 최소 4.4-lite2 (이력은 OpenBSD CVS에서 시작되는 곳)입니다. 그리고 권한이없는 파일에서 | sudo tee
작업 하고 권한있는 영역에 쓰는 경우에는 효과가 있지만 대부분의 경우 모든 권한을 sudo
얻고 싶어합니다. 그리고 sudo grep file | sudo tee
바보입니다.
sort
출력을 시작하기 전에 전체 입력을 읽어야하므로 입력을 안전하게 덮어 쓸 수 있습니다. 출력을 시작하기 전에 데이터를 메모리 나 임시 파일에 저장할 수 있습니다.
'-o'옵션은 이미 Unixsort
의 여섯 번째 판에 있습니다.
그러나 나는 그것이 유닉스 철학에 속하지 않는다는 것에 동의합니다. uniq
그 옵션이 sort
없었습니다 (그리고 -u
그때 없었습니다 ).
내 PDP-11에서 하나의 매개 변수를 취하는 작은 프로그램을 사용했습니다.
renac whatever
whatever
이미 존재하는 경우 stdin에서 임시 파일로 모든 내용을 쓰며 whatever
stdin 입력이 건조 된 후에 만 이름이 바뀌 었 습니다. 이렇게 renac
하면 입력을 덮어 쓰지 않고 파일 이름으로 리디렉션하는 대신 명령 출력을 파이프로 연결할 수 있습니다. 이런 식으로 덮어 쓰기 문제를 해결하는 것은 IMHO가 Unix 철학에 더 적합합니다.
stdin에 아무것도 도착하지 않은 경우 출력 파일을 덮어 쓰지 않고 (예 : 명령 행의 일부를 잘못 입력 한 결과) 옵션에 명명 된 파일에 stdin을 추가 할 수있는 옵션이 허용됩니다.
이것은 내가 만든 첫 번째 (첫 번째는 아니지만) 실제 C 프로그램 중 하나였습니다 (내 작업을 위해 주로 해당 시스템의 Pascal에서 개발했습니다).
apt
풍성한 GNU / 리눅스 사람들은 (from : 표준 입력을 흡수하고 moreutils 파일에 쓰기) renac
라는 프로그램으로 제공 되는 기능의 재 작성된 버전을 가질 수 있습니다 .sponge
man
), package
sponge
않았습니다 moreutils
.