Tôi nhận ra rằng nó !
có ý nghĩa đặc biệt đối với dòng lệnh trong ngữ cảnh của lịch sử dòng lệnh, nhưng ngoài ra, trong một kịch bản chạy, dấu chấm than đôi khi có thể gây ra lỗi phân tích cú pháp.
Tôi nghĩ rằng nó có một cái gì đó để làm với một event
, nhưng tôi không biết một sự kiện là gì hoặc nó làm gì. Mặc dù vậy, cùng một lệnh có thể hành xử khác nhau trong các tình huống khác nhau.
Ví dụ cuối cùng, dưới đây, gây ra lỗi; Nhưng tại sao, khi cùng một mã làm việc bên ngoài thay thế lệnh? .. sử dụng 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
sẽ thích hợp hơn. (được bảo vệ bởi 'dấu ngoặc đơn')
var=$(…)
(không có dấu ngoặc kép), và nó sẽ hoạt động như (tôi nghĩ) bạn mong đợi. Đây là vẫn “an toàn” vì phần giá trị của một nhiệm vụ đơn giản không phải là đối tượng để tách từ hoặc globbing (mặc dù điều này có thể không đúng với nhiệm vụ thực hiện thông qua lệnh nội trú (ví dụ export
, local
vv) theo tất cả vỏ). Thật không may, điều này không vượt quá các bài tập đơn giản vì các trích dẫn kép là cách để bảo vệ chống lại sự phân tách và tạo khối trong khi vẫn có các kiểu mở rộng khác trong các ngữ cảnh khác.