Tại sao răng cưa trên các lệnh tiêu chuẩn không được khuyến nghị?


19

Ví dụ: một bí danh phổ biến tôi đã thấy trong ~/.bashrctệp (hoặc tương đương) là

alias rm='rm -i'

Tuy nhiên, tôi đã thấy mọi người đề nghị chống lại điều này bởi vì

  1. bí danh có thể không tồn tại trên một hệ thống khác và vì bạn trở nên bất cẩn rm, bạn vô tình xóa một cái gì đó quan trọng. [1]
  2. bằng cách sử dụng bí danh này, bạn có hiệu lực tự rèn luyện để gõ yhoặc yessau mỗi rmlệnh, đánh bại toàn bộ mục đích.

Có những lý do khác để đề nghị chống lại điều này? Có thể một số chương trình chỉ đơn giản thực hiện các cuộc gọi rmthay vì \rmvà bí danh về nó có thể gây ra vấn đề cho họ không?

Tôi sử dụng rmđơn giản là một ví dụ, nhưng tôi cũng đã thấy các lệnh khác giống cphoặc mvđược bao phủ bởi các bí danh. Cá nhân, tôi đang dần dần rèn luyện bản thân để sử dụng một bí danh như thế này thay cho rm -i:

alias trash=`mv -v -t $HOME/.Trash`

3
Mỗi lần tôi đi qua một hệ thống có bí danh mặc định rm -i, nó sẽ huấn luyện tôi thêm một chút để tự động thêm -fcờ.
Jander

Bạn có thể bí danh rm -icho bất cứ điều gì bạn muốn. Chẳng hạn như del, irmv.v. Bạn không cần phải đặt bí danh cho nó rm. Điều này cắt ngang điểm 1, và bằng cách sử dụng có chọn lọc delhoặc rmtùy thuộc vào những gì bạn muốn, bạn cũng vượt qua điểm 2 ở một mức độ nào đó.
Martin Tournoij

Câu trả lời:


8

Giả sử rằng bạn đang sử dụng bash, điều này sẽ không gây ra vấn đề cho các tập lệnh, vì các bash shell không tương tác không có nguồn ~/.bashrchoặc ~/.bash_profile(có thể là nơi đặt bí danh của bạn hoặc là bước đầu tiên để cung cấp bí danh của bạn trong tập lệnh khác) . Tuy nhiên, nó có thể gây ra sự cố nếu bạn đang tìm nguồn cung cấp tập lệnh:

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

Câu hỏi của bạn bao gồm hầu hết mối quan tâm chung xung quanh việc khử răng cưa đối với các lệnh hiện có, vấn đề chính là các môi trường xa lạ xuất hiện ở cái nhìn đầu tiên giống nhau có thể tạo ra kết quả cực kỳ khác nhau. Ví dụ, răng cưa rmđể rm -icó ý định tốt, nhưng là xấu trong thực tế vì những lý do bạn nhà nước.


7

"Có những lý do khác để đề nghị chống lại điều này?"

Tất nhiên:

(3) Bởi vì một ngày nào đó tôi hy vọng sẽ thêm vào những nền tảng được xây dựng bởi các [-----------] và người hoang tưởng người trừng phạt những người khác cho răng cưa lệnh tiêu chuẩn, mặc dù răng cưa lệnh giữa các ý kiến, tốt, tiêu chuẩn .

Nghiêm túc mà nói, đây chỉ là những lời cảnh báo. Nếu bạn tin tưởng bản thân sẽ không rơi vào bất kỳ hố nào trong số đó, thì hãy cẩn thận và tiếp tục.

Cá nhân, tôi bí danh rất ít lệnh tiêu chuẩn; Tôi sử dụng các biến thể nhẹ bởi vì tôi, chỉ là một chút, hoang tưởng và hậu môn giữ lại. Nhưng một cách sử dụng tốt mà tôi đã tìm thấy cho việc này là liên quan đến các hệ thống mà tôi thường đăng nhập với quyền root hoặc người dùng khác và có một số điều tôi không muốn vô tình / lười biếng chạy như root:

alias irc="echo \"No you don't!\""

hoặc là

alias irc="su irc_user"

4

Như một ví dụ cực đoan, hãy để tôi chỉ bí danh một lệnh tiêu chuẩn để minh họa tại sao các lệnh tiêu chuẩn có thể gây hại:

alias ls='rm'

Rõ ràng, điều này là xấu bởi vì nó sẽ gây ra một bất ngờ khó chịu một ngày nào đó. Tương tự như vậy, thay thế các lệnh tiêu chuẩn bằng bí danh cuối cùng sẽ dẫn đến một bất ngờ đáng tiếc khi bạn ít mong đợi nhất.

Nhưng hãy để tôi trình bày một kịch bản phổ biến sẽ xảy ra với gần như mọi quản trị viên Unix khi họ thăng tiến trong sự nghiệp:

Một ngày nào đó trong tương lai, bạn sẽ bắt đầu một công việc mới và sẽ làm việc trên một hệ thống mới do những người khác thiết lập. Bây giờ sẽ là ba giờ sáng thứ bảy và bạn không suy nghĩ thẳng và dễ mắc sai lầm. Môi trường tiêu chuẩn của bạn sẽ không có sẵn. Trong thực tế, bạn là root.

Với điều này, bạn sẽ nhớ rằng rmnó không phải là bí danh rm -i? Bạn sẽ kiểm tra bí danh đặc biệt của mình mỗi khi bạn đăng nhập vào hộp không? Nếu bạn thay đổi môi trường của root, đồng nghiệp của bạn có hài lòng với thay đổi của bạn không?

Tôi thành thật trên hàng rào về điều này. Tôi đã làm việc trên hàng ngàn hệ thống trong sự nghiệp của mình và nếu tôi sửa đổi môi trường trên tất cả các hệ thống này, thật khó để thấy giá trị.

Aliasing rmđể rm -ilà rất phổ biến và tôi đã nhìn thấy nó ngăn ngừa nhiều vấn đề, nhưng nó cũng đã gây ra nhiều bất ngờ và giờ làm việc thêm để khôi phục tập tin vô tình bị xóa.

Vì vậy, bây giờ tôi cố gắng tránh răng cưa các lệnh hệ thống phổ biến. Thay vào đó, tôi sử dụng các bí danh và các hàm để làm những việc mà trình bao không thể dễ dàng thực hiện. Những gì tôi có xu hướng làm bây giờ là đính kèm một chữ cái thêm vào bí danh, như:

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

Và có lẽ tôi thực sự nên loại bỏ bí danh cuối cùng của mình, bởi vì việc thích nghi với thực tiễn mới cần có thời gian:

# For safety!
alias rm='rm -i'

8
Ghi nhớ các cờ cho lscó thể thuận tiện hơn ghi nhớ mười bí danh.
Bernhard

Rất đúng. Và trên thực tế, tôi hiếm khi sử dụng các bí danh này nữa. Tôi không chắc tại sao tôi vẫn có chúng, sau đó các bí danh (và chức năng) phức tạp hơn rất khó để tìm ra và rất tốt để tham khảo. Để đơn giản tôi có lẽ nên loại bỏ chúng.
Stefan Lasiewski

"Minh họa" (ví dụ đầu tiên) không thực sự hữu ích. Điều đó rõ ràng độc hại và chúng tôi biết rằng hệ thống bẫy bẫy có thể gây hại. rm-> rm -iví dụ của bạn tốt hơn nhiều. Một cái tốt khác sẽ là một cái bí danh rm để đặt mọi thứ vào một~/.trash
derobert

1
@Bernhard: Đúng, nhưng các bí danh nhanh hơn để gõ. (Nhưng mười là quá nhiều bất kể.)
Emanuel Berg

2
@StefanLasiewski: Gợi ý: không bao giờ xóa những thứ không hiển thị, vì lý do thẩm mỹ hoàn toàn. Hãy để họ ở lại trừ khi họ làm phiền bạn tích cực. Đó là một hành động nhanh chóng loại bỏ công cụ sau khi dành hàng giờ để thiết lập nó; và nếu bạn từng hối tiếc, bạn cảm thấy mình như một thằng ngốc vì không chỉ để họ như vậy.
Emanuel Berg

4

Có nhiều nguy hiểm hơn cho nó.

Ví dụ: nếu bạn sử dụng shell-commandtrong Emacs, bạn có thể nghĩ rằng bạn nhận được lệnh "của bạn" (hoặc bí danh , nhưng bạn không phải tấn công lsbí danh trong một thiết bị đầu cuối nhiều lần trước khi bạn quên tất cả về việc thiết lập bí danh, nghĩ về nó như bất kỳ lệnh nào khác ...) - thực tế (trở lại Emacs), bạn nhận được lệnh (không thiên vị). Emacs sẽ thực thi nó mà không có vấn đề gì, vì vậy bạn thậm chí có thể bị mù với những gì vừa xảy ra!

Đối với các máy tính và / hoặc hệ thống khác nhau, nếu bạn nghĩ rằng quá tẻ nhạt để thiết lập các .rctệp riêng lẻ cho tất cả chúng, bạn chỉ có thể có một tệp như vậy, nhưng có ifcác mệnh đề để điều chỉnh.

Ví dụ: thay vì đánh giá từng chức năng khi bạn viết chúng, chỉ khi bạn gặp sự cố với bất kỳ chức năng nào trong số chúng, hãy thêm chúng vào "danh sách đen", cuối cùng:

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi

3

Đổi tên các lệnh tiêu chuẩn bằng các bí danh (nghĩa là rm=rm -i) các công cụ chắc chắn có thể dẫn đến các bất ngờ nơi bí danh không có sẵn. Tôi không thích sử dụng như vậy, và (bởi một vài trải nghiệm cay đắng, cay đắng ;-) Tôi đã quen với việc đọc từng lệnh hai lần, và nếu nórm hay mvhay bất cứ thứ gì có khả năng phá hoại ba lần. Và các bí danh như vậy dẫn đến tự động "rm foo" ENTER "y" Rất tiếc !! dù sao đi nữa (và tốn thêm một lần nhấn phím mỗi lần).

Nhưng đó chỉ là tôi. Nếu bạn không muốn chạy trong môi trường ngoài hành tinh (máy khác, người dùng khác, ...) và bạn có thể cài đặt bí danh yêu thích của mình mọi lúc mọi nơi, hãy tự nhiên. Unix nổi tiếng là cung cấp cho người dùng quá nhiều dây để tự bắn vào chân mình.


0

Các câu trả lời khác là tốt, nhưng tất cả chúng chỉ nhìn vào cách nó ảnh hưởng đến bạn.

Hãy để tôi bật câu trả lời của @Stephan Laswieski lên đầu một chút.

Giả sử bạn không phải là người toàn diện, bạn có thể cần phải có người khác làm việc trên tài khoản người dùng của mình hoặc tư vấn cho bạn cách làm một cái gì đó.

Sau đó, khi họ làm điều gì đó hoặc bảo bạn làm điều đó, nó có thể không hoạt động như mong đợi.

Tốt nhất, bạn sẽ phải lãng phí thời gian để giải thích cho họ những gì đã xảy ra (nếu bạn ở ngay đó và có thể nhớ hoặc tìm ra bí danh là nguyên nhân gây ra vấn đề).

Tệ nhất, hãy xem một ví dụ về một trong những câu trả lời khác: alias ls = 'rm -rf'.

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.