Có bất kỳ nhược điểm nào của việc thiết lập `noclobber` không?


19

Cho rằng zshcó thể ghi đè tất cả các tệp được đưa ra lệnh:

>*

Tôi nghĩ rằng thiết lập tùy chọn noclobbersẽ là một ý tưởng tốt.

Tôi luôn có thể sử dụng >| filenếu tôi muốn sử dụng hành vi clobber mặc định trong cả bash và zsh. (zsh cũng cho phép cú pháp thay thế >!file).

Tôi đoán noclobberlà không được đặt mặc định vì khả năng tương thích POSIX, nhưng chỉ để chắc chắn:

Có bất kỳ nhược điểm để thiết lập noclobber?

Có cách nào để noclobberchỉ thiết lập cho vỏ tương tác không?


3
Tôi ngạc nhiên khi zsh ít nhất không cảnh báo về điều đó, vì nó cảnh báo về điều gì đó như rm *...
ilkkachu

Câu trả lời:


23

Lý do noclobberkhông được đặt theo mặc định là truyền thống. Là một vấn đề của thiết kế giao diện người dùng, bạn nên tạo ra một tập tin mới, đó là một hành động dễ dàng và đặt thêm một trở ngại cho hành động nguy hiểm hơn, đó là tạo một tập tin mới hoặc ghi đè lên một tập tin hiện có. Vì vậy, đó noclobberlà một ý tưởng tốt ( >để tạo một tệp mới, >|có khả năng ghi đè lên một tệp hiện có) và nó có thể đã được mặc định nếu vỏ được thiết kế một vài thập kỷ sau đó.

Tôi thực sự khuyên bạn nên sử dụng các mục sau trong tệp khởi động shell tương tác của bạn ( .bashrchoặc .zshrc):

set -o noclobber
alias cp='cp -i'
alias mv='mv -i'

Trong mỗi trường hợp (chuyển hướng, sao chép, di chuyển), mục tiêu là thêm một trở ngại khi hoạt động có thể có tác dụng phụ là xóa một số dữ liệu hiện có, mặc dù việc xóa dữ liệu hiện tại không phải là mục tiêu chính của hoạt động. Tôi không đưa rm -ivào danh sách này vì xóa dữ liệu là mục tiêu chính của rm.

Hãy lưu ý rằng noclobber-ilưới an toàn . Nếu họ kích hoạt, bạn đã làm sai điều gì đó . Vì vậy, đừng sử dụng chúng như một cái cớ để không kiểm tra những gì bạn ghi đè! Vấn đề là bạn nên kiểm tra xem tệp đầu ra không tồn tại. Nếu bạn nói file exists: foohoặc overwrite 'foo'?, điều đó có nghĩa là bạn đã phạm sai lầm và bạn sẽ cảm thấy tồi tệ và cẩn thận hơn. Cụ thể, đừng tập thói quen nói ynếu được nhắc ghi đè (có thể là bí danh alias cp='yes n | cp -i' mv='yes n | mv -i', nhưng nhấn Ctrl+ Clàm cho đầu ra trông đẹp hơn): nếu bạn có ý định ghi đè, hủy lệnh, di chuyển hoặc xóa đầu ra tập tin và chạy lại lệnh

Điều quan trọng là đừng có thói quen kích hoạt các két sắt đó bởi vì nếu bạn làm như vậy, một ngày nào đó bạn sẽ ở trên một máy không có cấu hình của bạn và bạn sẽ mất dữ liệu vì các biện pháp bảo vệ mà bạn đang tính đến ' t ở đó

noclobbersẽ chỉ được đặt cho các vỏ tương tác, vì .bashrchoặc .zshrcchỉ được đọc bởi các vỏ tương tác. Tất nhiên, bạn không nên thay đổi các tùy chọn shell theo cách có thể ảnh hưởng đến các tập lệnh, vì nó có thể phá vỡ các tập lệnh đó.


6
rmcó một tùy chọn -Imà tôi sử dụng và đề xuất: "nhắc một lần trước khi xóa nhiều hơn ba tệp hoặc khi xóa đệ quy; ít xâm phạm hơn -i, trong khi vẫn bảo vệ chống lại hầu hết các lỗi"
Reid

8
Tôi thực sự khuyên bạn không nên khử răng cưa cp và mv theo cách đó. Tuy nhiên, sử dụng -ilàm đối số mặc định cho chúng là một ý tưởng tuyệt vời, nhưng nó nên được áp dụng ở các tên bí danh khác nhau , không phải là bản gốc (ví dụ tôi luôn đặt alias copy="cp -i"alias move="mv -i"trong .bashrc của mình). Tại sao? Vì chế độ thất bại. Điều gì xảy ra khi bạn sử dụng máy hoặc người dùng khác không có bí danh cp / mv? Các tệp có khả năng bị ghi đè ngoài ý muốn (có thể không bị phát hiện!). Chế độ thất bại tương ứng với bí danh sao chép / di chuyển: shell phàn nàn rằng nó không nhận ra lệnh.
hlovdal

1
Ngoài ra còn có một chế độ thất bại bổ sung cho bí danh cp / mv: khi viết tập lệnh shell, ai đó được sử dụng bí danh cp = "cp -i" có thể viết một lệnh cp không chính xác mong đợi nó hoạt động như trong chế độ tương tác vì không có tên khác nhau. Ngược lại, mỗi khi tôi viết "copy somefile / some / where" tôi biết rằng tôi sử dụng bí danh chứ không phải lệnh cp trực tiếp. Và ngay cả khi tôi nên đặt một bản sao vào tệp shell thì nó cũng sẽ thất bại giống như với shell có bí danh bị thiếu.
hlovdal

1
Vì vậy, TL; DR lời khuyên để mặc định sử dụng -iđối số cho cp và mv là tuyệt vời, nhưng lời khuyên để sử dụng lại tên cp và mv là rất tệ. Thật tệ khi tôi phải trả lời bỏ phiếu. Vui lòng thay đổi để sử dụng các tên bí danh khác nhau và tôi sẽ bỏ phiếu.
hlovdal

1
@TomHale Bạn có thể sử dụng alias RM='command rm', điều này sẽ bảo zsh sử dụng lệnh bên ngoài rmthay vì bí danh. Bằng cách đó, bạn không phải phụ thuộc vào việc --interactive=neverthay thế trước đó -i.
Adaephon

6

Đặt noclobbertùy chọn shell trong ~/.bashrc(for bash) hoặc ~/.zshrc(hoặc chính xác hơn là $ZDOTDIR/.zshrcfor zsh) sẽ khiến nó hoạt động trong các phiên shell tương tác.

Các shell không tương tác (script) không đọc các tệp này.

Tùy chọn Shell thường không được kế thừa từ shell cha.

Điều này có nghĩa là bạn sẽ có thể đặt tùy chọn trong các tệp đó mà không sửa đổi hành vi trong các tập lệnh hiện có, trừ khi tập lệnh nguồn rõ ràng các tệp đó.

Nhược điểm duy nhất của việc này mà tôi có thể thấy là bạn sẽ liên tục quên rằng bạn đã đặt tùy chọn, ít nhất là vào lúc bắt đầu. Sau đó, như với tất cả các loại của sự vật, bạn sẽ bắt đầu sử dụng thường xuyên >|, ngay cả trong trường hợp bạn thực sự có thể không muốn clobber tập tin (giống như những người có bí danh cho rm, cpmvvới -itùy chọn luôn đặt, cuối cùng bắt đầu luôn luôn sử dụng -ftrên dòng lệnh).


2
Với bash, các tùy chọn được kế thừa nếu $SHELLOPTS( $BASHOPTSđối với các tùy chọn shopt) ở trong môi trường (không phải là điều bạn thường muốn làm mặc dù vì lý do này).
Stéphane Chazelas

3

Nhược điểm là, nếu bạn đã quen với việc noclobberkích hoạt, một ngày nào đó bạn sẽ sử dụng một hệ thống mà nó không hoạt động và bạn sẽ thực hiện một lệnh hoàn toàn nguy hiểm, hy vọng sẽ noclobbercứu bạn ... và nó sẽ không cứu bạn. Và sau đó bạn sẽ phải hy vọng rằng có một bản sao lưu đủ gần đây để khôi phục dữ liệu bạn đã hủy vì bạn cho rằng bạn sẽ được yêu cầu xác nhận trước.


Chắc chắn, một ngày nào đó bạn sẽ sử dụng một hệ thống không hoạt động. Khi bạn đang sử dụng một hệ thống lạ, bạn nên đặc biệt cẩn thận và đảm bảo rằng các bản sao lưu được cập nhật trước khi thực hiện bất kỳ điều gì có khả năng phá hủy như chuyển hướng đầu ra sang tệp.
Gilles 'SO- ngừng trở nên xấu xa'
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.