Tại sao sắp xếp -o hữu ích?


32

Triết lý UNIX nói: làm một việc và làm tốt. Tạo các chương trình xử lý văn bản, bởi vì đó là một giao diện phổ quát.

Các sortlệnh, ít nhất GNU sắp xếp, có một -otùy chọn để xuất ra một tập tin thay vì stdout. Tại sao, nói, sort foobar -o whateverhữu ích khi tôi có thể chỉ sort foobar > whatever?


3
GNU không phải là UNIX. Trong nhiều khía cạnh, nó khác nhau, ví dụ như các đối số dài dòng (--help, v.v.).
sakisk

@faif đúng vậy . nhưng tôi sẽ cho rằng đó không phải là một câu trả lời cho câu hỏi cụ thể này.
strugee

2
Đó là lý do tại sao tôi để lại bình luận và không trả lời :)
sakisk

Câu trả lời:


47

Nó không chỉ là loại GNU có nó. BSD sort cũng có nó. Và tại sao?
(Tôi nghĩ đó cũng là một câu hỏi hay ...)

Từ trang man: "Đối số được cung cấp là tên của tệp đầu ra sẽ được sử dụng thay vì đầu ra tiêu chuẩn. Tệp này có thể giống như một trong các tệp đầu vào."

Bạn không thể đi đến cùng một tệp với chuyển hướng, chuyển hướng đầu ra sẽ xóa sạch tệp.

Để làm rõ hơn, nếu tôi muốn sắp xếp một tệp và đặt các kết quả được sắp xếp vào cùng một nơi tôi có thể nghĩ để thử sort < foo > foo. Ngoại trừ việc chuyển hướng đầu ra cắt ngắn tệp foođể chuẩn bị nhận đầu ra. Và sau đó không có gì để sắp xếp. Nếu không có "-o" thì cách làm sẽ là sort < foo > bar ; mv bar foo. Tôi giả sử -otùy chọn làm một cái gì đó tương tự mà không làm bạn phải lo lắng về nó.


12
Bạn cũng có thể sudo sort -o /some/placerằng người dùng không thuộc quyền của bạn không được phép viết thư.
bahamat

8
Và để giúp tránh nhầm lẫn với nhận xét của bahamat: Anh ta không nói rằng họ có thể sắp xếp một tệp mà họ không có quyền. Chuyển hướng I / O hoạt động ... kém với sudo. Vì chuyển hướng diễn ra trong shell của bạn (sudo chỉ là một lệnh nó sẽ chạy), sử dụng chuyển hướng với một lệnh thông qua sudo là khó chịu. (Ban đầu tôi bối rối không biết bahamat đang nói gì, nên hình dung những người khác cũng có thể bị nhầm lẫn).
kurtm

3
Chỉ để chơi người ủng hộ của quỷ, thực sự có những lựa chọn thay thế cho cả vấn đề "tệp đầu vào giống như tệp đầu ra" và vấn đề "chuyển hướng đặc quyền", và cả hai phương án đều theo tinh thần "làm tốt một việc". Đối với "input = output", có sponge(một phần của moreutils). Đối với chuyển hướng đặc quyền, có đường ống đến | sudo tee, cũng có lợi ích hạn chế sự leo thang đặc quyền đối với một chương trình đơn giản , tee.
jw013

Điểm tốt. Mặc dù -otùy chọn sorttồn tại từ lâu trước khi bọt biển đã làm. Nó ít nhất là 4,4-lite2 (đó là nơi lịch sử bắt đầu trong OpenBSD CVS). Và đối với trường hợp bạn đang hoạt động trên một tệp không có đặc quyền và viết thư cho một khu vực đặc quyền, sẽ | sudo teehoạt động rất tốt, nhưng trong phần lớn thời gian, bạn muốn toàn bộ điều đó được đặc quyền và sudogiúp bạn vượt qua. Và sudo grep file | sudo teethật ngớ ngẩn.
kurtm

1
sortcần phải đọc toàn bộ đầu vào trước khi nó có thể bắt đầu xuất ra bất cứ thứ gì, đó là lý do tại sao nó có thể ghi đè lên đầu vào của nó một cách an toàn. Nó có thể lưu trữ dữ liệu trong bộ nhớ hoặc trong các tệp tạm thời trước khi bắt đầu xuất.
Stéphane Chazelas

12

Các tùy chọn '-o' là đã có trong các sortcủa Sixth Edition của Unix

Tuy nhiên tôi đồng ý với bạn rằng nó không nằm trong triết lý Unix. uniqkhông có tùy chọn đó (và sortkhông có -usau đó).

Trên PDP-11 của tôi, tôi đã sử dụng một chương trình nhỏ có một tham số:

renac whatever

Nếu whateverđã tồn tại, nó sẽ ghi mọi thứ từ stdin vào một tệp tạm thời, nó chỉ được đổi tên thành whateversau khi đầu vào stdin cạn kiệt. Bằng cách đó, bạn có thể dẫn đầu ra của bất kỳ lệnh nào vào renacthay vì chuyển hướng đến tên tệp mà không có cơ hội ghi đè đầu vào. Giải quyết vấn đề ghi đè theo cách đó là IMHO phù hợp hơn với triết lý Unix.

Một số bổ sung sau này cho chương trình là: không ghi đè tệp đầu ra nếu không có gì đến trên stdin (ví dụ: kết quả của việc nhập sai một phần của dòng lệnh) và cho phép tùy chọn nối thêm stdin vào tệp đã đặt tên.

Đây là một trong những chương trình C thực sự đầu tiên (nếu không phải là đầu tiên) mà tôi đã thực hiện (đối với công việc của tôi, tôi chủ yếu phát triển trong Pascal trên hệ thống đó).


Nếu tôi hiểu rõ, aptnhững người GNU / Linux có hương vị có thể có một phiên bản viết lại của chức năng renacđược cung cấp, với một chương trình được gọi là sponge(từ man: ngâm đầu vào tiêu chuẩn và ghi vào một tệp nhiều hơn ), package nữa.
41754

@uprego. Tôi chỉ xem một nguồn của bọt biển.c và nó dường như có rất nhiều mã trên đầu vì chức năng bọt biển (stdin -> stdout).
Anthon

@uprego spongecũng không moreutilsthực sự được tạo bởi GNU.
jw013

Tôi chưa có ý định khẳng định điều đó.
41754
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.