Jawaban singkat: builtin fc
(perintah fix) dari bash
fc
adalah perintah, built-in di shell bash, dibuat untuk mengedit & mengeksekusi kembali perintah sejarah.
Ia hadir di CygWin juga dan berfungsi pada semua distribusi Linux yang saya uji:
fc -s '\'='/' -1
Beberapa penjelasan
Beberapa kata lebih lanjut tentang mengapa Anda mendapatkan "substitusi gagal"
Tampaknya untuk s
modifikator belum (belum) menerapkan substitusi karakter backslash \
, itulah yang melarikan diri. Untuk memastikan kita harus melihat kode, misalnya, versi gnu dari ekspansi sejarah bash (tetapi ada perintah di atas untuk mendapatkan apa yang Anda coba lakukan ... jadi saya menganggapnya malas ....).
Beberapa catatan:
Kami beranggapan bahwa itu akan berfungsi setiap RegEx kami temukan bekerja dengan sed
, tetapi tidak dijamin. Garis miring terbalik adalah karakter pelarian dari ekspansi dan masalahnya ada di sini. Selain itu perilaku ekspansi terkait dengan shopt
opsi, jadi kita harus mulai melihat kasus per kasus ...
Ketika Anda menempelkan string cd C:\Foo\Bar
dalam bash shell Anda, itu akan diperluas dan akan muncul untuk penerjemah sebagai cd C:FooBar
; dalam bentuk ini akan disimpan dalam $_
variabel internal juga.
Jika Anda malah menempelkan cd "C:\Foo\Bar"
atau cd 'C:\Foo\Bar'
dalam $_
variabel Anda harus menemukan C:\Foo\Bar
.
Karena ekspansi History dilakukan segera setelah baris lengkap dibaca, sebelum shell memecahnya menjadi kata-kata, Anda mungkin tergoda untuk mulai menggunakannya dengan sedikit bashism , misalnya, dengan beberapa turunan dari (mungkin menambah :p
atau :q
, ""
, parsing dan sebagainya ...)
!!:0 ${_//\\/\/}
Ini adalah momen untuk mengingat bahwa tidak aman untuk mulai bermain dengan path dan nama file , terutama jika itu berasal dari clipboard windows (baca secara umum halaman Mengapa tidak parse ls
?, Pada dasarnya terkait dengan kemungkinan untuk menggunakan tab, spasi dan baris baru sebagai karakter yang benar untuk nama file dan direktori ...).
Terlebih lagi ketika Anda menempelkan teks yang diambil dengan mouse , Anda juga dapat menempelkan ruang utama. Ini dapat menghindari bahwa perintah Anda akan selesai dalam sejarah (itu tergantung dari opsi shell ...). Jika demikian, pengikut Anda !!
akan menjadi perintah yang tidak terkontrol ... (lihat contoh dalam jawaban lain ).Ini adalah risiko nyata yang tidak dibutuhkan .
Kesimpulan
Ekspansi sejarah memperkenalkan kata-kata dari daftar riwayat ke dalam aliran input, membuatnya mudah untuk mengulangi perintah, menyisipkan argumen ke perintah sebelumnya ke dalam jalur input saat ini, atau memperbaiki kesalahan dalam perintah sebelumnya dengan cepat.
Jika tidak mudah saya mulai berpikir kita melakukan sesuatu yang salah ;-)
Ad mual: percobaan kecil
Saya telah mengaktifkan histverify
di shell maka ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
kemudian saya tekan Enterdan sebagai ekspansi terverifikasi saya temukan
echo D:\Foo\Bar {1,2}A
lalu saya tekan Enterlagi dan bergema
D:FooBar 1A 2A
Ini tampaknya menunjukkan bahwa yang substitution failed
dihasilkan dalam ekspansi sejarah diproses sebelum ekspansi Brace , jadi pertama-tama , dan tampaknya mengkonfirmasi bahwa s
pengubah sejarah belum (belum) memproses substitusi \
karakter sebagai regex nyata. ..
cd 'C:\foo\bar'