Tại sao `du -sh *` phàn nàn về các tùy chọn không hợp lệ?


7

Tôi đã tìm kiếm tốt nhất thông qua Google, nhưng trong suốt cuộc đời tôi, tôi không thể tìm ra nên sử dụng cái gì thay vì *(dấu hoa thị) sau một bản cập nhật gần đây (thậm chí Wikipedia dường như nghĩ

du -sh * and du -sh * nên làm việc)

Tôi đã sử dụng

du -sh * | sort -h

kể từ trước khi sắp xếp có -htùy chọn (trên Fedora tôi nghĩ, đã mất một thời gian trước khi tôi có thể sử dụng sort -htrên CentOS), nhưng đột nhiên * dường như đưa ra một danh sách dài

du: invalid option -- ' '

trong đó ' 'đi qua tất cả các tùy chọn không hợp lệ không được đề cập trong trang man.

Tôi sẽ rất biết ơn nếu ai đó có thể cho tôi biết những gì sẽ tương đương với

du -sh * | sort -h

trên các phiên bản cập nhật.



@jmkane Lệnh của bạn hoạt động trên Fedora 21
vài thứ gì đó

Câu trả lời:


15

Bạn có một tập tin với một tên vui nhộn, có thể bắt đầu bằng một -. Hãy nhớ rằng các khối (như *) được mở rộng bằng vỏ của bạn chứ không phải lệnh đang được chạy. Ví dụ, giả sử bạn có:

$ ls -1
foo
-q

Thư mục đủ đơn giản, với hai tập tin trong đó. ( -1Tùy chọn cho coreutils lstạo cột đơn đầu ra của nó.)

Khi bạn chạy du -sh *, shell thông báo rằng đối số thứ hai chứa một ký tự đặc biệt ( *) và không được trích dẫn, do đó, nó sẽ mở rộng toàn cầu. Nó mở rộng nó đến mọi thứ phù hợp, trong trường hợp này foo-q. Hiệu ứng chính xác như thể bạn chạy:

$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.

Lỗi ở trên là rõ ràng: Các tiện ích GNU cho phép các tùy chọn trộn với tên tệp để thuận tiện; duđang lấy tên tập tin -qlàm tùy chọn. Và không có -qlựa chọn nào. (Đây thực sự là điều tốt nhất bạn có thể mong đợi; tệ hơn là nếu có một -qtùy chọn và nó đã làm điều gì đó không mong muốn.)

Gợi ý của Stépahane là thay đổi toàn cầu của bạn thành ./*, điều này dẫn đến kết quả du -sh ./foo ./-qlà tất nhiên được lấy làm tên tệp, vì nó không còn bắt đầu bằng -. Tùy chọn khác mà ông gợi ý là sử dụng --, thông báo cho các tiện ích GNU rằng không còn tùy chọn nào nữa mà chỉ có tên tệp / thư mục.

Thực sự bạn nên luôn luôn sử dụng một trong hai … ./*hoặc … -- *thay vì *, nhưng tất cả chúng ta đều lười biếng. Chỉ cần cẩn thận, đặc biệt là nếu bạn không tin tưởng tất cả các tên tệp.


ok, báo cáo lỗi của tôi đã được gửi ngay bây giờ, nhưng tôi đã thêm một liên kết đến câu hỏi này, vì vậy nếu @jmkane có thể xem đây có phải là trường hợp không, nó sẽ giúp các nhà phát triển biết họ có phải tìm kiếm lỗi hay không. Tôi đã biết về điều này, chưa bao giờ có bất kỳ tệp nào trong hệ thống của tôi bắt đầu bằng - nhưng thật tuyệt khi biết điều này.
switch87

1
Lưu ý rằng --không chỉ GNU mà cả POSIX cũng vậy nên được hầu hết các dutriển khai thực hiện.
jlliagre

Bạn đã hoàn toàn đúng. Tôi vẫn có thể sử dụng du -sh * trong các thư mục khác, vì vậy nó phải là thứ gì đó mới trong thư mục tôi đã kiểm tra thường xuyên, nhưng tôi không thể thấy bất cứ điều gì rõ ràng và tôi chắc chắn sẽ sử dụng ./* hoặc - * trong tương lai.
jmkane

0

du đang lấy dấu gạch ngang trong tệp và lấy nó làm đối số.

Nếu bạn chuyển '-' cho lệnh, điều đó biểu thị sẽ không có tùy chọn nào khác được gửi, vì vậy hãy chạy lệnh như thế này: du -fh - * hoặc du -sh - *

đã làm cho tôi...

chủ đề này đã giúp: - http://www.webhostingtalk.com/showthread.php?t=1354139

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.