Adakah yang tahu mengapa bash masih memiliki substitusi histori yang diaktifkan secara default? Saya .bashrc
sudah memasukkan set +H
selama 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 readline
pustaka 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:
sumber
ls -l foo/bar/baz/weeble.cpp
denganless !$
dari recall perintah dan mengedit itu.&
? Mengapa saya harus melarikan diri atau mengutip nama file yang mengandung?
? Ada UI untuk orang yang menganggap ini masalah.!$
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.Jawaban:
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
$HISTFILE
tidak 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 bagi
bash
pengembang). Anda tampaknya berpikir bahwa sebagian besarbash
pengguna 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 +H
dalam~/.bashrc
file Anda , atau melobibash
pengembang untuk mengubah default (yang, saya percaya, akan mengecewakan dan membingungkan lebih banyak orang daripada itu akan membantu ).sumber
bash
pengguna. Saya tidak berpikir salah satu dari kita tahu seberapa umum itu. Saya akan menyarankan jika Anda sangat menyukainya, Anda mengirimkan permintaan fitur / bug kebash
milis. Lihat savannah.gnu.org/mail/?group=bash!
sangat jarang digunakan sebagai karakter normal yang - mengesampingkan WTF - jumlah orang yang tertangkap jauh melebihi oleh jumlah orang yang masih menggunakannya untuk menggantikan sejarah.!
ini tidak khusus untuk paling Bourne-seperti kerang, maupun dalambash
skrip, ada banyak jalan dengan mana orang cukup dapat belajar bahwa"$my_var some text!!"
akan memperluas$my_var
tetapi tidak!!
. Saya mulai terbiasa dengan cangkang Bourne-likebusybox ash
, dan pertemuan pertama saya denganbash
substitusi 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 menggunakannyabash
.Substitusi sejarah bermanfaat. Ambil contoh
sumber
.bashrc
.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
bash
pengguna 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,
bash
adalah 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 adalahbash
, 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
bash
pengguna mungkin menemukan sintaksis substitusi sejarah dalam konteks positif : mereka membacanya atau seseorang memperlihatkannya kepada mereka dan mereka melihat kemungkinan kegunaannya, ketika mereka pertama kali belajarbash
.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.
sumber
bash
dan masih digigit terkejut, sebagai tunggal mengutip tidak selalu bekerja pada!
karena rusakbash
implementasi.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.
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.
Opsi clunkier menurut saya ...
Ya, orang menganggapnya berguna. Apa gunanya memiliki kendali jarak jauh mengingat Anda dulu hanya bisa bangun dan mengganti saluran?
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:
sumber
shopt -s histverify
tetapi 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.$
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, danbash
spesifik. 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.zsh
, ketika kutip tunggal!
selalu bekerja, tetapi tidak untukbash
, di mana implementasi menghasilkan hasil yang tidak terduga . Anda berkata, kita harus tahu aturannya , apakah Anda tahu aturan terkait itu?