sort -o가 유용한 이유는 무엇입니까?


32

유닉스 철학은 말합니다 : 한 가지 일만하고 잘하십시오. 범용 인터페이스이므로 텍스트를 처리하는 프로그램을 만드십시오.

sort명령은, 적어도 GNU 정렬에서가 -o대신 파일로 출력 옵션을 stdout. 내가 왜 sort foobar -o whatever할 수있을 때 유용한가 sort foobar > whatever?


3
GNU는 UNIX가 아닙니다. 여러 측면에서 예를 들어 자세한 인수 (--help 등)가 다릅니다.
sakisk

예 @faif 그 사실이야 . 그러나 나는 이것이 특정 질문에 대한 답이 아니라고 주장합니다.
strugee

2
내가 코멘트로 남겨 아닌 답 : 이유
sakisk

답변:


47

그것은 단지 GNU 정렬이 아닙니다. BSD 정렬도 있습니다. 그리고 왜?
(나는 그것이 좋은 질문이라고 생각했다 ...)

매뉴얼 페이지에서 : "주어진 인수는 표준 출력 대신 사용할 출력 파일 이름입니다.이 파일은 입력 파일 중 하나와 동일 할 수 있습니다."

리디렉션을 사용하여 동일한 파일로 이동할 수 없으면 출력 리디렉션이 파일을 지 웁니다.

더 명확히하기 위해 파일을 정렬하고 정렬 된 결과를 같은 장소에 넣으려면 시도해 볼 수도 있습니다 sort < foo > foo. 출력 경로 재 지정을 제외하고 출력 foo수신 준비 파일 이 잘립니다 . 그리고 정렬 할 것이 없습니다. "-o"가 없으면 할 수있는 방법 sort < foo > bar ; mv bar foo입니다. 나는 -o옵션이 당신이 걱정할 필요없이 비슷한 것을한다고 가정합니다 .


12
당신은 또한 수 있습니다 sudo sort -o /some/place이 아닌 privleged 사용자가 쓰기 권한을 가지고 있지 않습니다.
bahamat

8
그리고 bahamat의 의견과 혼동을 피하기 위해 : 권한이없는 파일을 정렬 할 수 있다고 말하지 않습니다. sudo에서는 I / O 리디렉션이 제대로 작동하지 않습니다. 리디렉션은 셸에서 발생하기 때문에 (sudo는 실행할 명령 일 뿐이므로 sudo를 통한 명령으로 리디렉션을 사용하는 것은 성가신 일입니다. (나는 처음에 바하 마트가 말한 것에 대해 혼란 스러웠으므로 다른 사람들도 혼란 스러울 것이라고 생각했습니다).
kurtm

3
악마의 옹호자를하기 위해 실제로 "입력 파일은 출력 파일과 같습니다"문제와 "권한있는 리디렉션"문제에 대한 대안이 있으며, 두 대안 모두 "한 가지 잘 수행"의 정신에 더 가깝습니다. "input = output"에는 sponge(moreutils의 일부)가 있습니다. 권한있는 리디렉션의 경우에는 파이핑이 있으며 | sudo tee, 권한 상승을 단일 간단한 프로그램으로 제한하는 이점도 tee있습니다.
jw013

좋은 지적입니다. 스폰지보다 오래 전에 존재 하는 -o옵션 이지만 sort. 최소 4.4-lite2 (이력은 OpenBSD CVS에서 시작되는 곳)입니다. 그리고 권한이없는 파일에서 | sudo tee작업 하고 권한있는 영역에 쓰는 경우에는 효과가 있지만 대부분의 경우 모든 권한을 sudo얻고 싶어합니다. 그리고 sudo grep file | sudo tee바보입니다.
kurtm

1
sort출력을 시작하기 전에 전체 입력을 읽어야하므로 입력을 안전하게 덮어 쓸 수 있습니다. 출력을 시작하기 전에 데이터를 메모리 나 임시 파일에 저장할 수 있습니다.
Stéphane Chazelas

12

'-o'옵션은 이미 Unixsort여섯 번째 판에 있습니다.

그러나 나는 그것이 유닉스 철학에 속하지 않는다는 것에 동의합니다. uniq그 옵션이 sort없었습니다 (그리고 -u그때 없었습니다 ).

내 PDP-11에서 하나의 매개 변수를 취하는 작은 프로그램을 사용했습니다.

renac whatever

whatever이미 존재하는 경우 stdin에서 임시 파일로 모든 내용을 쓰며 whateverstdin 입력이 건조 된 후에 만 이름이 바뀌 었 습니다. 이렇게 renac하면 입력을 덮어 쓰지 않고 파일 이름으로 리디렉션하는 대신 명령 출력을 파이프로 연결할 수 있습니다. 이런 식으로 덮어 쓰기 문제를 해결하는 것은 IMHO가 Unix 철학에 더 적합합니다.

stdin에 아무것도 도착하지 않은 경우 출력 파일을 덮어 쓰지 않고 (예 : 명령 행의 일부를 잘못 입력 한 결과) 옵션에 명명 된 파일에 stdin을 추가 할 수있는 옵션이 허용됩니다.

이것은 내가 만든 첫 번째 (첫 번째는 아니지만) 실제 C 프로그램 중 하나였습니다 (내 작업을 위해 주로 해당 시스템의 Pascal에서 개발했습니다).


내가 잘 이해했다면, apt풍성한 GNU / 리눅스 사람들은 (from : 표준 입력을 흡수하고 moreutils 파일에 쓰기) renac라는 프로그램으로 제공 되는 기능의 재 작성된 버전을 가질 수 있습니다 .spongeman), package
41754

@uprego. 방금 sponge.c의 소스를 보았고 스폰지 (stdin- > stdout) 기능으로 인해 많은 코드 오버 헤드 가있는 것 같습니다 .
Anthon

@uprego 는 GNU에 의해서도 실제로 만들어 지지 sponge않았습니다 moreutils.
jw013

나는 그것을 주장하지 않았습니다.
41754
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.