Silakan lihat perintah-perintah ini:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Dua perintah pertama menghasilkan gelembung pemberitahuan seperti yang diharapkan. Yang ketiga menunjukkan kesalahan.
dan
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Di sini juga, echo
berfungsi untuk dua perintah pertama tetapi tidak pada yang ketiga.
Lebih banyak masalah di sini (meskipun saya tidak berencana menggunakan ini): keduanya notify-send "SYNC!TIME"
dan echo "SYNC!TIME"
memberi bash: !TIME": event not found
.
Tapi keduanya notify-send
dan echo
bekerja dengan"SYNC! TIME"
Dapatkah seseorang tolong jelaskan mengapa bash: !": event not found
kesalahan itu muncul?
.bashrc
garis Andaset +H
. Catatan yang!
sudah non-khusus dalam skrip; memperlakukannya sebagai istimewa akan mematahkan banyak skrip yang memenuhi standar. Ini hanya diperlakukan sebagai "spesial" di shell interaktif, dan hanya secara default sampai Anda memperbaikinya. :-)Karena dalam bash,
!
adalah kata khusus (OK, karakter), ia memiliki arti khusus dalam konteks yang berbeda. Dalam kasus khusus ini, Anda tidak setuju dengan pentingnya pencarian riwayat. Dariman bash
:Pada dasarnya, ini berarti bahwa bash akan mengambil karakter setelah
!
dan mencari sejarah Anda untuk perintah pertama yang ditemukan yang dimulai dengan karakter tersebut. Lebih mudah ditunjukkan daripada dijelaskan:The
!
ekspansi sejarah diaktifkan, yang cocok perintah pertama dimulai dengane
yang sebelumnya dijalankanecho foo
yang kemudian jalankan lagi. Jadi, ketika Anda menulis"SYNC TIME!"
, bash melihat!"
, mencari sejarah untuk perintah yang dimulai dengan"
, gagal dan mengeluh tentang hal itu. Anda bisa mendapatkan kesalahan yang sama dengan menjalankan, misalnya!nocommandstartswiththis
.Untuk mencetak tanda seru, Anda harus menghindarinya dengan salah satu dari dua cara berikut:
sumber
echo Hello world!
tidak bekerja --- ekspansi sejarah tidak dipicu oleh kekosongan ;-) (ah, kasus sudut yang bagus ...)!
adalah kata cipta dibash
, seperti POSIX juga menyatakan . Tapi saya cukup yakin statusnya sebagai orang sama sekali tidak terkait dengan perannya dalam ekspansi sejarah dan tidak relevan dengan perlakuannya dalam tanda kutip ganda.!
adalah kata yang dilindungi undang-undang karena meniadakan status keluar perintah / jalur pipa, sehingga tidak dapat digunakan sebagai perintah. Tidak ada kata reserved lain adalah khusus dalam"
konteks -quoted, sementara$
ini tidak kata cipta tapi yang diperlakukan khusus.