Bash использует восклицательные знаки для расширений истории, как объяснено в ответах на этот вопрос (например, sudo !!
запускает предыдущую командную строку с помощью sudo
). Тем не менее, я не могу найти нигде, который объясняет, что выполняет следующая команда (то есть один восклицательный знак):
!
Похоже, что ничего не печатать и выйти с 1, но я не уверен, почему это так. Я посмотрел онлайн и на странице руководства Bash, но ничего не могу найти, кроме того факта, что это «зарезервированное слово» - но так оно }
и есть , и запускаю это:
}
печатает ошибку:
bash: syntax error near unexpected token `}'
bash
history-expansion
exit-status
мистифицировать
источник
источник
!
указывает на «начало» выражения расширения истории.Ответы:
Одиночный
!
в начале команды отрицает состояние выхода команды или конвейера : если команда завершается0
, она переходит в состояние1
(сбой), а если она выходит из ненулевого значения, она превращается в0
(успешный) выход.Это использование описано в руководстве по Bash:
!
С помощью следующей команды не отрицает пустую команду, которая ничего не делает и возвращает истинное (эквивалент в:
команде ). Таким образом, он преобразует истину в ложь и выходит со статусом 1, но не выдает ошибки.Существуют также и другие виды использования
!
внутриtest
и[[
команд, где они отрицают условный тест. Это не связано с тем, что вы видите. И в вашем вопросе, и в тех случаях он не связан с расширением истории и!
отделен от любых других терминов.источник
Вы можете найти один восклицательный знак, документированный в разделе руководства bash. 3.2.2 Трубопроводы
Также раздел 3.2.4.2 Условные конструкции
Также раздел 4.1 Bourne Shell Builtins
Также следует отметить, что
!
начнется подстановка истории, если только не будет: пробел, табуляция, конец строки, '=' или '(' (когда опция оболочки extglob включена с помощью встроенной функции shopt).источник
Потому
!
что используется в сравнениях и означает НЕ .Например:
источник
!
аргументаtest
команды (включая встроенную версию bash), а не значение!
при использовании в позиции команды.! [...]
чтобы соответствовать вопросу в этом случае.[]
это такtest
. Я немного поспешил.!
встроенная команда, инвертирует смысл конвейера.Другое использование:
#!
встроенная команда, вызывает именованный интерпретатор для выполнения сценария.!
указатель события, помечает слово командной строки как подстановку истории!=
оператор неравенства$!
переменная оболочки, возвращает номер процесса последней фоновой команды.источник
ls -l /tmp
cd !$
Это приведет вас в каталог / tmp.! сопровождаемый строкой выполняет самую последнюю предыдущую команду (все еще в буфере команд), которая началась с данной строки. Возможно, оболочка только что обнаружила, что ни одна предыдущая команда не начиналась с <null>.
источник