Mengapa penggantian bash history masih diaktifkan secara default? [Tutup]


17

Adakah yang tahu mengapa bash masih memiliki substitusi histori yang diaktifkan secara default? Saya .bashrcsudah memasukkan set +Hselama bertahun-tahun tetapi beberapa orang lain masih digigit oleh fitur ini.

Mengingat hampir semua orang menggunakan terminal dengan fitur salin-tempel dan bash yang dikompilasi dengan readlinepustaka dan substitusi sejarah diaktifkan secara default hanya di shell interaktif, apakah benar-benar ada alasan untuk memiliki fitur sama sekali? Tak satu pun dari skrip yang ada akan rusak bahkan jika ini dinonaktifkan secara default untuk semua shell.

Coba ini jika Anda tidak tahu mengapa penggantian riwayat rusak:

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(Jelas fitur memiliki masalah besar jika dinonaktifkan secara default untuk semua skrip dan ada fitur untuk memverifikasi hasil sebelum mengeksekusi:. shopt -s histverify)

Lihat juga:


16
Anda tampaknya berpikir bahwa orang tidak menggunakan substitusi sejarah. Aku menggunakannya setiap hari. Saya menemukan untuk cepat mengikuti ls -l foo/bar/baz/weeble.cppdengan less !$dari recall perintah dan mengedit itu.
Martin Bonner mendukung Monica

2
@ MartinBonner Jadi Anda bisa mengaktifkannya. Pertanyaannya adalah mengapa itu diaktifkan secara default , bukan mengapa itu masih ada.
Barmar

5
@Barmar: Tentu. Tetapi poin saya adalah untuk menantang asumsi bahwa pertanyaan itu didasarkan.
Martin Bonner mendukung Monica

5
Jika kami mengikuti alasan Anda, apa pun yang mengharuskan pelarian atau penawaran harus dinonaktifkan secara default. Mengapa saya harus melarikan diri atau mengutip URL yang mengandung &? Mengapa saya harus melarikan diri atau mengutip nama file yang mengandung ?? Ada UI untuk orang yang menganggap ini masalah.
jcaron

3
Saya menggunakan !$beberapa kali sehari, dan !!cukup sering juga. Saya harus mengakui bahwa saya tidak menggunakan banyak pengganti sejarah, tapi saya pasti tidak akan senang jika perilaku default shell yang saya gunakan selama bertahun-tahun tiba-tiba berubah.
jcaron

Jawaban:


32

Jika Anda sudah terbiasa dengan hal itu bash, maka berurusan dengan pola substitusi sejarah tidak lebih mungkin menggigit Anda daripada menangani karakter lain yang khusus untuk shell ini. Namun, jika seseorang tidak terbiasa dengan shell atau tidak pernah menggunakan fitur subtitusi sejarahnya, itu jelas akan mengejutkan ketika string yang tampaknya tidak dikutip atau dikutip ganda memicu hal itu.

Dalam shell interaktif dengan pergantian sejarah yang diaktifkan, !karakter tersebut memiliki cara yang hampir sama dengan $karakternya yang khusus, yaitu di mana-mana kecuali jika lolos dengan \atau dalam string yang dikutip satu kali.

Berlawanan dengan $melalui, pergantian sejarah tidak berkembang dalam dokumen-dokumen di sini, dan karena mereka berorientasi garis, mereka juga akan terjadi pada garis di mana substitusi berada dalam konteks yang tidak dikutip atau konteks yang dikutip ganda (dalam baris itu ketika dipindai secara terpisah) . Lihat laporan bug ini untuk info lebih lanjut .

Substitusi histori dinonaktifkan di skrip (skrip) non-interaktif karena kapabilitas riwayat perintah shell tidak diperlukan di sana, bukan karena fitur tersebut memiliki "masalah utama". Dalam sebuah skrip, menyimpan setiap perintah $HISTFILEtidak masuk akal, dan substitusi sejarah juga bukan sesuatu yang ingin Anda andalkan dalam sebuah skrip.

Apakah itu harus diaktifkan secara default atau tidak dalam shell interaktif dapat diperdebatkan (meskipun saya tidak sepenuhnya yakin bahwa perdebatan di sini akan sangat berarti bagibash pengembang). Anda tampaknya berpikir bahwa sebagian besar bashpengguna mengalami masalah dengan ekspansi riwayat, tetapi tidak satu pun dari Anda dan saya yang tahu seberapa umum menggunakannya.

Kerang Unix memungkinkan seseorang untuk memodifikasi perilaku shell agar sesuai dengan kebutuhan dan selera pribadi seseorang. Jika Anda ingin mematikan substitusi histori untuk semua shell interaktif Anda, terus lakukan apa yang Anda lakukan dengan menggunakan set +Hdalam ~/.bashrcfile Anda , atau melobi bashpengembang untuk mengubah default (yang, saya percaya, akan mengecewakan dan membingungkan lebih banyak orang daripada itu akan membantu ).


2
@MikkoRantalainen Anda tampaknya berpikir bahwa penggantian riwayat bukanlah sesuatu yang digunakan sebagian besar bashpengguna. Saya tidak berpikir salah satu dari kita tahu seberapa umum itu. Saya akan menyarankan jika Anda sangat menyukainya, Anda mengirimkan permintaan fitur / bug ke bashmilis. Lihat savannah.gnu.org/mail/?group=bash
Kusalananda

8
Baik. Masalahnya sebenarnya bukan tentang substitusi sejarah sama sekali, tetapi tentang fakta bahwa "tanda kutip" ganda di Bash sebenarnya bukan tanda kutip dalam arti bahasa lain menggunakan istilah tersebut, tetapi lebih berfungsi seperti kurung jenis khusus. @MikkoRantalainen, biasakan untuk meletakkan apa pun yang Anda tidak ingin Bash menafsirkan dengan cara khusus dalam tanda kutip tunggal !
leftaroundabout

5
@leftaroundabout Itu tergantung pada apa yang Anda maksud dengan menafsirkan. Sebagian besar bahasa menafsirkan karakter kontrol dalam string untuk output (tetapi diberikan, tidak dengan cara yang sama seperti dalam shell ketika hanya menyeret string di sekitar). Aturan mengutip Perl juga berfungsi seperti shell (variabel interpolasi). Seperti bahasa pemrograman apa pun, akan sangat membantu jika seseorang dapat mengingat bahasa apa yang sedang digunakan.
Kusalananda

5
" Maksud saya adalah! karakter karakter khusus sangat jarang digunakan " Saya akan mengatakan itu sebaliknya ... !sangat jarang digunakan sebagai karakter normal yang - mengesampingkan WTF - jumlah orang yang tertangkap jauh melebihi oleh jumlah orang yang masih menggunakannya untuk menggantikan sejarah.
TripeHound

3
-1 untuk mengalihkan kesalahan ke kutipan yang tidak tepat. Karena !ini tidak khusus untuk paling Bourne-seperti kerang, maupun dalam bashskrip, ada banyak jalan dengan mana orang cukup dapat belajar bahwa "$my_var some text!!"akan memperluas $my_vartetapi tidak !!. Saya mulai terbiasa dengan cangkang Bourne-like busybox ash, dan pertemuan pertama saya dengan bashsubstitusi sejarah adalah saya digigit olehnya ketika saya mencoba untuk melakukan beberapa lapisan cepat dalam cangkang interaktif. Orang-orang yang mahir dalam penggunaan portabel dan scripting dari kerang mirip Bourne sering digigit olehnya setidaknya sekali saat menggunakannya bash.
mtraceur

9

Substitusi sejarah bermanfaat. Ambil contoh

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
Begitu? Jika Anda merasa bermanfaat, Anda dapat mengaktifkannya di .bashrc.
Barmar


3
@Barmar dan jika Anda merasa tidak berguna, Anda dapat menonaktifkannya. Lucu bagaimana simetri bekerja.
hobbs

3
@ hobbs Jika Anda tidak tahu itu ada, bagaimana Anda tahu untuk menonaktifkannya?
Barmar

2
Jawaban ini berfungsi menjelaskan satu alasan mengapa fitur ini bermanfaat. Saya pikir OP ingin memahami mengapa kegunaan ini cukup untuk membenarkan perilaku ini, meskipun OP (dan yang lainnya, seperti orang-orang yang mengajukan beberapa pertanyaan terkait pada stackexchange ini) menganggap perilaku ini mengejutkan / tidak terduga.
mtraceur

4

Kelambanan sosial / budaya.

Pertanyaan ini ada di ruang bagaimana-manusia-bekerja masalah, jadi saya akan menjawab dari sudut itu, tanpa mengemukakan pendapat tentang apakah fitur harus dihidupkan secara default.

Untuk memulai, untuk memastikan Anda memahami pihak lain, pertimbangkan bahwa gangguan yang Anda rasakan karena harus keluar dari cara untuk mematikan fitur, adalah gangguan yang akan mereka rasakan jika mereka harus keluar dari cara mereka untuk menghidupkan fitur.

Gabungkan hal-hal di atas dengan fakta bahwa cukup banyak bashpengguna yang menggunakan fitur ini, saran untuk menghapusnya atau mematikannya secara default bertemu dengan penolakan dari orang-orang yang sudah nyaman menggunakannya di sana secara default.

Juga, bashadalah shell default untuk banyak orang (tidak hanya dalam login default atau pengertian shell sistem, tetapi dalam pengertian psikologis). Jika kerangka referensi Anda untuk mengutip shell adalah bash, jika itu shell yang Anda pelajari terlebih dahulu, faktanya! adalah karakter shell khusus akan terasa alami dan otomatis bagi Anda (atau setidaknya, ketika Anda pertama kali mempelajarinya, itu akan menjadi bagian dari cara shell, hanya satu kebiasaan untuk menerima di antara banyak).

Dan jika Anda memikirkannya, banyak bashpengguna mungkin menemukan sintaksis substitusi sejarah dalam konteks positif : mereka membacanya atau seseorang memperlihatkannya kepada mereka dan mereka melihat kemungkinan kegunaannya, ketika mereka pertama kali belajar bash.

Itu hanya datang dari dunia periferal kerang mirip Bourne, bahwa Anda akan digigit dengan !menjadi istimewa dan karenanya cenderung melihatnya secara negatif: Karena jika Anda terbiasa dengan kerang di mana Anda tidak pernah memiliki fitur, maka yang pertama paparan itu akan ketika sekrup Anda ketika Anda mencoba untuk menyelesaikan sesuatu dengan terburu-buru.

TL; DR: Sebagian besar pengguna mungkin tidak terlalu peduli apa defaultnya , sebagian pengguna menyukai fitur tersebut dan memiliki keunggulan kuat karena sudah seperti itu, dan belum ada cukup banyak orang yang secara aktif mendukung fitur tersebut. atasi itu.


2
Tidak, itu tidak hanya ketika datang dari kerang lain. Aku sudah tahu fitur ini selama bertahun-tahun di bashdan masih digigit terkejut, sebagai tunggal mengutip tidak selalu bekerja pada !karena rusak bashimplementasi.
Philippos

@ Pilipos Itu menakutkan (well, tidak benar-benar menakutkan ... tapi semacam qualia negatif yang menyusahkan). Terima kasih telah menunjukkan ini. Saya akan mencoba meninjau kembali jawaban ini nanti untuk menjelaskan maksud Anda menjadi jawaban saya begitu saya memikirkan cara yang baik untuk mengintegrasikannya.
mtraceur

2

Mengapa penggantian bash history masih diaktifkan secara default?

Karena banyak orang yang menggunakannya, dan orang-orang yang menggunakan bash shell interaktif mungkin harus mengetahui aturan untuk menghindari masalah dan umumnya akan menemukannya lebih membantu daripada menyakitkan.

Bashrc saya sudah termasuk set + H selama bertahun-tahun tetapi beberapa orang lain masih tergigit oleh fitur ini.

Jadi ini adalah fitur yang tidak Anda gunakan, itu tidak berarti mayoritas pengguna tidak menggunakannya. Anda dapat mengajukan petisi agar standar diubah, tetapi Anda harus melihat A) porsi orang yang peduli , dan B) rasio orang yang lebih suka dengan cara Anda. Orang yang peduli dan tidak menyukainya mungkin telah menonaktifkannya. Mengubahnya akan membantu ketika mereka mendapatkan akun di komputer baru. Orang yang peduli dan memang menyukainya harus memperbarui pengaturan mereka di setiap komputer yang mereka gunakan dan setiap akun yang mereka dapatkan di masa depan.

Mengingat bahwa hampir semua orang menggunakan terminal dengan fitur copy-paste

Opsi clunkier menurut saya ...

apakah benar-benar ada alasan untuk memiliki fitur sama sekali? Tak satu pun dari skrip yang ada akan rusak bahkan jika ini dinonaktifkan secara default untuk semua shell.

Ya, orang menganggapnya berguna. Apa gunanya memiliki kendali jarak jauh mengingat Anda dulu hanya bisa bangun dan mengganti saluran?

(Jelas fitur memiliki masalah besar jika dinonaktifkan secara default untuk semua skrip dan ada fitur untuk memverifikasi hasil sebelum mengeksekusi: shopt -s histverify.)

Sejarah tidak benar-benar masuk akal dalam skrip, tetapi yang lebih penting itu bisa menyebabkan masalah keamanan. Dalam kasus Anda, Anda bisa menghindari masalah dengan menggunakan tanda kutip tunggal. Saya tidak ingat ini pernah menyebabkan masalah bagi saya, jadi saya tidak tahu bagaimana Anda dapat mengatakan itu memiliki 'masalah besar'. Apakah ini menyebabkan masalah aktual bagi Anda, atau apakah Anda kesal karena harus menetapkan default di komputer baru?

Saya tidak melihat perbedaannya daripada harus melarikan diri atau menggunakan tanda kutip tunggal dalam hal ini jika Anda benar-benar ingin mendapatkan uang:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
Lihat pertanyaan terkait (kolom kanan); sebagian besar pertanyaan mengenai fitur ini secara tidak sengaja dan menganggap bahwa shell rusak. Saya pribadi belajar tentang fitur ini sejak lama karena saya tidak sengaja menggunakan urutan karakter yang menyebabkan output salah. Saya akan diselamatkan oleh shopt -s histverifytetapi itu tidak secara default. Selain itu, mencari tahu penyebabnya sendiri cukup sulit karena pesan kesalahannya samar ("event not found") dan urutan karakter yang memicunya sulit dicari oleh google.
Mikko Rantalainen

1
Orang-orang benar-benar digigit oleh fitur ini karena fitur sintaksis shell "universal" seperti $menjadi istimewa di dalam "..."adalah salah satu hal pertama yang dipelajari orang tentang shell, sedangkan fakta yang !khusus di dalam "..."(tetapi hanya dalam mode interaktif) kurang dikenal secara luas, biasanya tidak diajarkan dengan segera / jelas, dan bashspesifik. Juga, shell Bourne-like sebagian besar memiliki kesimetrian antara text-in-a-script dan text-on-the-interactive-shell, jadi Anda biasanya dapat copaste dari satu ke yang lain dan membuatnya bekerja sama - dan fitur ini membuat satu-satunya pengecualian.
mtraceur

1
Saya tidak melihat apa bedanya dengan melarikan diri atau menggunakan tanda kutip tunggal Benar untuk zsh, ketika kutip tunggal !selalu bekerja, tetapi tidak untuk bash, di mana implementasi menghasilkan hasil yang tidak terduga . Anda berkata, kita harus tahu aturannya , apakah Anda tahu aturan terkait itu?
Philippos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.