Mengapa aliasing lebih dari perintah standar tidak dianjurkan

19

Misalnya, alias umum yang pernah saya lihat di ~/.bashrcfile (atau yang setara) adalah

alias rm='rm -i'

Namun, saya telah melihat orang merekomendasikan ini karena

  1. alias mungkin tidak ada di sistem lain dan karena Anda menjadi ceroboh rm, Anda secara tidak sengaja menghapus sesuatu yang penting. [1]
  2. dengan menggunakan alias ini, Anda pada dasarnya melatih diri Anda untuk mengetik yatau yessetelah setiap rmperintah, yang mengalahkan seluruh tujuan.

Apakah ada alasan lain untuk merekomendasikan hal ini? Mungkinkah beberapa program hanya membuat panggilan, rmbukan \rm, dan mengatasinya dapat menyebabkan masalah bagi mereka?

Saya menggunakan rmhanya sebagai contoh, tetapi saya telah melihat perintah lain suka cpatau mvditutupi oleh alias juga. Secara pribadi, saya perlahan melatih diri untuk menggunakan alias seperti ini di tempat rm -i:

alias trash=`mv -v -t $HOME/.Trash`
Ricardo Altamirano
sumber
3
Setiap kali saya tersandung sistem dengan alias default rm -i, itu melatih saya sedikit lebih untuk secara otomatis menambahkan -fbendera.
Jander
Anda dapat alias rm -iuntuk apa pun yang Anda inginkan. Seperti del, irm, dll Anda tidak perlu untuk alias untuk rm. Ini menghindari titik 1, dan dengan secara selektif menggunakan delatau rmtergantung pada apa yang Anda inginkan, Anda juga menghindari titik 2 sampai taraf tertentu.
Martin Tournoij

Jawaban:

8

Dengan asumsi bahwa Anda menggunakan bash, ini seharusnya tidak menyebabkan masalah untuk skrip, karena bash shell non-interaktif tidak bersumber ~/.bashrcatau ~/.bash_profile(yang kemungkinan besar tempat alias Anda diletakkan, atau merupakan langkah pertama untuk mencari alias Anda di skrip lain) . Namun, hal itu dapat menyebabkan masalah jika Anda mencari skrip:

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

Pertanyaan Anda mencakup sebagian besar kekhawatiran umum tentang pengalihan perintah yang ada, yang utama adalah bahwa lingkungan yang tidak dikenal yang pada pandangan pertama tampak sama berpotensi menghasilkan hasil yang sangat berbeda. Misalnya, aliasing rmuntuk rm -imemiliki niat baik, tetapi buruk dalam praktek untuk alasan Anda negara.

Chris Down
sumber
7

"Apakah ada alasan lain untuk merekomendasikan hal ini?"

Tentu saja:

(3) Karena suatu hari saya berharap dapat menambah fondasi yang dibangun oleh [-----------] dan orang-orang paranoid yang menghukum orang lain karena meniadakan perintah standar, walaupun aliasing perintah standar adalah, yah, standar .

Namun serius, ini hanya peringatan. Jika Anda memercayai diri sendiri untuk tidak jatuh ke dalam lubang kehancuran itu, maka waspadalah dan teruskan.

Secara pribadi, saya alias sangat sedikit perintah standar; Saya menggunakan sedikit variasi karena saya, hanya sedikit, paranoid dan anal. Tapi satu manfaat yang saya temukan untuk ini adalah berkaitan dengan sistem di mana saya sering login sebagai root atau pengguna lain, dan ada beberapa hal yang saya tidak ingin secara tidak sengaja / malas dijalankan sebagai root:

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

atau

alias irc="su irc_user"
goldilocks
sumber
4

Sebagai contoh ekstrem, izinkan saya hanya alias perintah standar untuk menggambarkan mengapa aliasing perintah standar dapat berbahaya:

alias ls='rm'

Jelas, ini buruk karena akan menyebabkan kejutan buruk suatu hari nanti. Demikian juga, mengganti perintah standar dengan alias pada akhirnya akan menyebabkan kejutan yang disayangkan ketika Anda tidak mengharapkannya.

Tapi izinkan saya menyajikan skenario umum yang akan terjadi pada hampir setiap admin Unix saat mereka maju dalam karir mereka:

Suatu hari di masa depan, Anda akan memulai pekerjaan baru dan akan bekerja pada sistem baru yang dibuat oleh orang lain. Ini akan menjadi jam tiga pagi pada hari Sabtu dan Anda tidak berpikir jernih dan cenderung membuat kesalahan. Lingkungan standar Anda tidak akan tersedia. Faktanya, Anda root.

Mengingat ini, apakah Anda akan mengingat yang rmtidak alias rm -i? Apakah Anda akan memeriksa alias khusus Anda setiap kali Anda masuk ke dalam kotak? Jika Anda mengubah lingkungan root, apakah rekan kerja Anda akan senang dengan perubahan Anda?

Saya jujur ​​di pagar tentang ini. Saya telah bekerja pada ribuan sistem dalam karier saya, dan jika saya memodifikasi lingkungan pada semua sistem ini, akan sulit untuk melihat nilainya.

Mengasingkan rmke rm -isangat umum dan saya telah melihatnya mencegah banyak masalah, tetapi juga menyebabkan banyak kejutan dan jam kerja ekstra untuk memulihkan file yang terhapus secara tidak sengaja.

Jadi sekarang saya mencoba untuk menghindari aliasing perintah sistem umum. Sebaliknya saya menggunakan alias dan fungsi untuk melakukan hal-hal yang shell tidak dapat dengan mudah dilakukan. Apa yang saya cenderung lakukan sekarang adalah melampirkan surat tambahan ke alias, seperti:

# 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 ; }

Dan mungkin saya benar-benar harus menyingkirkan alias terakhir saya, karena beradaptasi dengan praktik baru membutuhkan waktu:

# For safety!
alias rm='rm -i'
Stefan Lasiewski
sumber
8
Mengingat bendera untuk lsmungkin lebih nyaman daripada mengingat sepuluh alias.
Bernhard
Sangat benar. Dan faktanya, saya jarang menggunakan alias ini lagi. Saya tidak yakin mengapa saya masih memilikinya, selain itu alias (dan fungsi) yang lebih rumit sulit untuk dipecahkan dan bagus untuk referensi. Untuk kesederhanaan, saya mungkin harus menghapusnya.
Stefan Lasiewski
"Ilustrasi" (contoh pertama) tidak terlalu berguna. Itu jelas berbahaya, dan kita tahu sistem jebakan bisa berbahaya. Anda rm-> rm -icontoh adalah jauh lebih baik. Satu lagi yang bagus akan menjadi salah satu yang alias rm untuk meletakkan hal-hal di a~/.trash
derobert
1
@ Bernhard: Benar, tetapi alias lebih cepat untuk mengetik. (Tapi sepuluh terlalu banyak terlepas dari itu.)
Emanuel Berg
2
@StefanLasiewski: Petunjuk: jangan pernah menghapus barang yang tidak muncul, karena alasan estetika semata. Biarkan mereka tetap kecuali mereka mengganggu Anda secara aktif. Ini adalah tindakan cepat menghapus barang setelah menghabiskan berjam-jam mengaturnya; dan jika Anda pernah menyesalinya, Anda merasa seperti orang idiot karena tidak membiarkannya begitu saja.
Emanuel Berg
4

Ada lebih banyak bahaya untuk itu.

Misalnya, jika Anda menggunakan shell-commanddalam Emacs, Anda mungkin berpikir Anda mendapatkan perintah "Anda" (atau alias , tetapi Anda tidak harus memukul lsalias di terminal yang berkali-kali sebelum Anda lupa semua tentang pengaturan alias, memikirkan itu seperti perintah lain ...) - pada kenyataannya (kembali ke Emacs), Anda mendapatkan perintah (tidak diubah). Emacs akan menjalankannya tanpa masalah, jadi Anda bahkan mungkin buta dengan apa yang baru saja terjadi!

Adapun komputer dan / atau sistem yang berbeda, jika Anda pikir itu terlalu membosankan untuk mengatur .rcfile individual untuk mereka semua, Anda hanya dapat memiliki satu file seperti itu, tetapi dengan ifklausa untuk menyesuaikan.

Misalnya, alih-alih menilai setiap fungsi saat Anda menulisnya, hanya ketika Anda mengalami masalah dengan salah satu dari mereka, tambahkan mereka ke "daftar hitam", terakhir:

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

Mengganti nama perintah standar dengan alias (yaitu, rm=rm -ihal-hal) tentu saja dapat menyebabkan kejutan ketika alias tidak tersedia. Saya lebih suka untuk tidak menggunakan seperti itu, dan (oleh beberapa pahit, pengalaman pahit ;-) Saya sudah menjadi acustomed untuk membaca setiap perintah dua kali, dan jika itu rmatau mvatau apa pun yang berpotensi merusak tiga kali. Dan alias semacam itu menyebabkan "rm foo" ENTER "y" otomatis Ups !! tetap (dan biaya penekanan tombol ekstra setiap kali).

Tapi itu hanya aku. Jika Anda tidak berharap untuk berjalan di lingkungan asing (mesin lain, pengguna lain, ...) dan Anda dapat menginstal alias favorit Anda di mana pun Anda berada, menjadi liar. Unix terkenal memberi pengguna lebih dari cukup tali untuk menembak kaki mereka sendiri.

vonbrand
sumber
0

Jawaban lainnya baik, tetapi mereka semua hanya melihat bagaimana pengaruhnya terhadap Anda.

Biarkan saya mengubah jawaban @Stephan Laswieski di kepala itu sedikit.

Dengan asumsi Anda tidak mahatahu, Anda mungkin perlu orang lain mengerjakan akun pengguna Anda atau memberi tahu Anda cara melakukan sesuatu.

Kemudian, ketika mereka melakukan sesuatu atau menyuruh Anda melakukannya, itu mungkin tidak berfungsi seperti yang diharapkan.

Paling-paling, Anda harus membuang waktu untuk menjelaskan kepada mereka apa yang terjadi (jika Anda di sana dan dapat mengingat atau mengetahui bahwa alias adalah penyebab masalah).

Paling buruk, lihat twist pada contoh di salah satu jawaban lain: alias ls = 'rm -rf'.

Joe
sumber