Я ввожу эту команду:
sh -c "echo '!a'"
Это дает ошибку
bash !a': event not found
Это несколько вследствие того, что! специальный символ, но так как я включаю в одинарные кавычки, я не должен получать это.
Восклицательный знак используется для извлечения вашей истории bash .
В вашем случае сообщение об ошибке исходит от текущей оболочки, а не от оболочки, которую вы хотите запустить (*). Что происходит, так это то, что одинарные кавычки не учитываются, поскольку для вашей текущей оболочки они находятся внутри двойных кавычек и поэтому теряют свой особый статус и являются простыми символами. Но внутри двойных кавычек расширение истории с помощью !
все еще работает ...
Если вы сделаете это по-другому: sh -c 'echo "!a"'
, то это сработает, потому что внешние одинарные кавычки «скрывают» !
.
(*) Вы получите ту же ошибку, если заменить sh
на echo
: echo -c "echo '!a'"
!
зарезервированное слово; здесь часть sh руководства:
Зарезервированные слова
Зарезервированные слова являются словами, которые имеют особое значение к оболочке и распознаны в начале строки и после оператора управления. Следующее является зарезервированными словами:
! elif fi while case else for then { } do done until if esac
Если Вы хотите распечатать зарезервированные слова как символ:
sh -c "echo '"\!"a'"
Смотрите на sh/bash руководство!