Saya mengerti kesalahan berikut ini karena !
digunakan untuk ekspansi sejarah:
$ echo "Hello!Tim"
bash: !Tim: event not found
Namun jika saya memasukkan perintah ke dalam skrip dan menjalankan skrip, tidak ada masalah:
$ cat myscript
echo "Hello!Tim"
$ bash myscript
Hello!Tim
Mengapa demikian? Apakah manual bash menyebutkan alasannya?
shopt
pengubah untuk membuatnya berfungsi dalam skrip Anda. Saya tahu itu bukan jawaban yang Anda cari.!!
atau!-2
(angka sejarah negatif / relatif) atau serupa. Kebanyakan mereka akan dipecahkan dengan cara lain, tetapi itu masih merupakan pertanyaan yang bagus tentang bagaimana shell bekerja (dan ketika Anda / tidak perlu melarikan diri dari exclams Anda!).Jawaban:
Ya, ekspansi riwayat diaktifkan secara default hanya untuk shell interaktif.
Untuk mengaktifkannya untuk skrip shell, tulis:
Untuk menonaktifkannya di shell interaktif, tulis:
Untuk menentukan apakah ekspansi riwayat saat ini diaktifkan atau tidak, gunakan beberapa bentuk kode berikut:
Dalam mulai mengajar kelas shell, saya menggali manual secara ekstensif untuk mencoba menentukan apakah "shell interaktif" itu sebenarnya. Ini pertanyaan pusaran air, jadi izinkan saya menyelamatkan Anda dari beberapa masalah:
Shell memiliki opsi BANYAK. Beberapa opsi ini diinisialisasi dengan cara yang berbeda ketika shell memiliki terminal pengendali (atau ketika dimulai dengan
-i
, bla bla, apa pun, lihat di bawah).SEMUA opsi shell dapat diubah secara individual.
"Shell interaktif" adalah istilah yang menipu ketika Anda mencoba mendefinisikannya dengan tepat. Ini benar-benar hanya kumpulan pengaturan opsi.
Pertanyaan tentang pengaturan mana yang membuat shell menjadi interaktif atau tidak tidak mungkin dijawab; itu menjadi konyol. Hal ini justru pertanyaan filosofis sama dengan Kapal Theseus .
Jika Anda memulai shell interaktif, tetapi kemudian menonaktifkan ekspansi histori, gunakan
--noediting
flag, set--norc
, matikanexpand_aliases
, dll, dll., Lalu dalam arti apa shell itu interaktif? Atau, kapan itu menjadi tidak interaktif lagi? Anda tidak dapat menjawab pertanyaan-pertanyaan ini.Yang benar adalah bahwa "interaktif" hanyalah label yang nyaman untuk koleksi berbagai opsi shell. Demikian juga "non-interaktif." Hal yang sama; hanya kumpulan perilaku yang masing-masing dapat diubah secara individual.
Intinya: shell berperilaku berbeda ketika dimulai "secara interaktif" versus ketika itu dimulai "non-interaktif." Mencoba mendefinisikan istilah-istilah ini secara tepat setelah memulai adalah konyol. Lihat saja masing-masing opsi shell untuk memahami perilakunya.
Saya lupa bahwa selain penelitian saya sendiri, saya mempostingnya secara luas di situs ini.
sumber
set -H
. Mungkin inferensi Anda bahwa "ekspansi sejarah diaktifkan secara default hanya untuk shell interaktif".case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
set -H
. Itu ADALAH opsi histexpand.set -o history
, setelah memverifikasi denganset -o
skrip bahwa itu dinonaktifkan.