Tôi có thể tạo tương tác `rm` chỉ khi sử dụng globalbing không? (trong bash hoặc zsh hoặc cả hai)


15

Bất cứ khi nào tôi có rmnhiều vật phẩm cùng một lúc với lớp vỏ và thậm chí có khả năng nhỏ nhất là mô hình sẽ mở rộng hơn tôi mong đợi, tôi luôn cố gắng nhớ thêm -i, nhưng (dĩ nhiên) tôi có thể quên và vô tình thổi bay thứ gì đó hữu ích. Một số người cố gắng giải quyết vấn đề này bằng một bí danh, alias rm='rm -i'nhưng tôi ghét ý tưởng làm cho rm luôn tương tác, bởi vì sau đó tôi sẽ có thói quen sử dụng -fmọi lúc, điều này rõ ràng sẽ đánh bại toàn bộ mục đích.

Những gì tôi muốn làm là rmchỉ sử dụng -ikhi tôi sử dụng globalbing, và -fdĩ nhiên là để ghi đè -i, vì vậy tôi vẫn có thể thổi bay toàn bộ thư mục với thông thường rm -rf junk.

Do đó rm *blah*sẽ thực sự được rm -i *blah*nhưng rm blahsẽ hoạt động chính xác như được gõ.

Trong trường hợp có sự khác biệt về cách thực hiện điều này trong các shell khác nhau, tôi sẽ chọn một câu trả lời cung cấp các phương thức cho cả bash zsh so với các câu trả lời chỉ bao gồm cái này hoặc cái kia.


Lưu ý : Tôi không thực sự tin rằng đây thực sự là một ý tưởng tốt; Tôi chỉ hỏi nếu có thể. Nếu bạn nghĩ rằng đây là một ý tưởng ngu ngốc, tôi sẽ rất vui khi nghe lý do đằng sau ý kiến ​​của bạn, nhưng xin vui lòng không đăng những bình luận như vậy trong trường trả lời . Câu trả lời thực sự cho tôi biết làm thế nào để làm điều này hoặc giải thích rằng / tại sao không thể (hoặc có thể cung cấp một phương pháp thay thế để có được kết quả tương tự). Nhưng nếu bạn muốn cho tôi biết lý do tại sao điều này là ngu ngốc, xin vui lòng gửi như một bình luận. Tôi sẽ phản đối những bình luận có lý do ngay cả khi tôi không đồng ý với kết luận đó.


7
Một vài gợi ý: với các tiện ích GNU, rm -Igiống như -ichỉ kích hoạt khi có nhiều hơn ba tệp hoặc -rđược thông qua. Trong bash, sử dụng Ctrl-x *phím tắt để mở rộng toàn cầu và tự kiểm tra nó.
jw013

2
Với bash, tôi tin rằng câu trả lời là "không". Với zsh, bạn có thể tận dụng lợi thế của mình noglob, ví dụ, răng cưa rm đến noglob my-rm, và sau đó my-rm là một tập lệnh kiểm tra toàn cầu, mở rộng nó và vượt qua -i hay không. Không chắc chắn, không biết zsh.
derobert

@derobert: bạn chắc chắn nghe có vẻ như bạn biết zsh khá tốt.
iconoclast

@iconoclast Không, không phải zsh, chỉ Google. Kì lạ thay, tôi thấy rằng khi cố gắng tìm cách làm điều đó trong bash. :-P
derobert

Nếu bạn muốn một cái gì đó trông giống như rm nhưng thực sự hoạt động khác nhau, tôi nên viết một tập lệnh (hoặc bí danh / hàm / hàm chức năng) được gọi myrmvà để tập lệnh đó làm những điều tuyệt vời mà bạn thích.
Walter A

Câu trả lời:


9

Nó không dễ. Vấn đề là khi bạn làm:

rm -- *.txt

rm chỉ nhìn thấy danh sách các tập tin, không phải là mẫu hình cầu đã được mở rộng bởi trình bao.

Những gì bạn có thể làm là (zsh):

alias rm='noglob rm'

Điều này nói với zsh rằng các mẫu không nên được mở rộng khi gọi rm. Sau đó, bạn có thể xác định lại rm là một hàm thực hiện việc mở rộng và thêm "-i" nếu cần là một cái gì đó như:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

Vấn đề với cách tiếp cận đó là "rm" mới này không thấy sự khác biệt giữa

rm *

rm '*'

Để xóa tệp được gọi *, bạn phải viết nó:

rm [*]

-1

Hoạt động trong bash, có thể trong vỏ khác. Đặt trong của bạn.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
Bạn có thể sử dụng command rmđể tránh mã hóa cứng PATH. Ngoài ra, cách tiếp cận kiểm tra số lượng đối số là không đáng tin cậy, vì rmcó thể có các tùy chọn.
jw013

1
"$ 1" nên được trích dẫn, hoặc điều này sẽ thất bại nếu tệp duy nhất được truyền có chứa một khoảng trắng. @ jw013 - Bạn cũng có thể thoát khỏi lệnh, ví dụ\rm
jordanm

@jordanm Bạn đúng về nhu cầu trích dẫn $1với dấu ngoặc kép, nhưng sai về lệnh thoát. Trích dẫn chỉ triệt tiêu bí danh, KHÔNG tìm kiếm chức năng. Câu trả lời này là gợi ý một chức năng, không phải bí danh.
jw013

1
Ít nhất bản chỉnh sửa cũ là chức năng - bản chỉnh sửa mới loại bỏ các tùy chọn dòng lệnh của người dùng, đây có lẽ không phải là điều chính xác để làm.
jw013

@ jw013 - Tôi không biết rằng chỉ hoạt động cho tra cứu bí danh, không phải chức năng. Cảm ơn vì thông tin.
jordanm
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.