Я понимаю, что это !
имеет особое значение для командной строки в контексте истории командной строки, но, кроме этого, в рабочем скрипте восклицательный знак может иногда вызывать ошибку синтаксического анализа.
Я думаю , что это что - то делать с event
, но я понятия не имею , что такое событие или что он делает. Несмотря на это, одна и та же команда может вести себя по-разному в разных ситуациях.
Последний пример ниже вызывает ошибку; но почему, когда тот же код работал вне подстановки команд? .. используя 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
было бы более подходящим. (защищено «одинарными кавычками»)
var=$(…)
(без двойных кавычек), и это будет работать так, как вы думаете. Это все еще «безопасно», потому что часть значения простого присваивания не подвержена разбиению или смещению слов (хотя это может быть не так для присваиваний, выполняемых через встроенные функции (например export
, local
и т. Д.) Во всех оболочках). К сожалению, это не выходит за рамки простых присваиваний, поскольку двойные кавычки - это способ защиты от разбиения и разбивки слов, в то же время получая другие типы раскрытия в других контекстах.