Saya menyadari bahwa !
memiliki arti khusus pada baris perintah dalam konteks sejarah baris perintah, tetapi selain itu, dalam skrip runing tanda seru kadang-kadang dapat menyebabkan kesalahan penguraian.
Saya pikir itu ada hubungannya dengan event
, tetapi saya tidak tahu apa acara itu atau apa fungsinya. Meski begitu, perintah yang sama dapat berperilaku berbeda dalam situasi yang berbeda.
Contoh terakhir, di bawah ini, menyebabkan kesalahan; tetapi mengapa, ketika kode yang sama bekerja di luar substitusi perintah? .. menggunakan GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
akan lebih tepat. (dilindungi oleh 'kutipan tunggal')
var=$(…)
(tanpa tanda kutip ganda), dan itu akan berfungsi seperti (saya pikir) yang Anda harapkan. Ini masih “aman” karena nilai bagian dari tugas sederhana tidak tunduk kata membelah atau globbing (meskipun ini tidak mungkin benar dari tugas dilakukan melalui builtin (misalnya export
, local
, dll) di bawah semua kerang). Sayangnya, ini tidak melampaui penugasan sederhana karena tanda kutip ganda adalah cara untuk melindungi terhadap pemisahan kata dan penggumpalan sementara masih mendapatkan jenis ekspansi lain dalam konteks lain.