Почему эта команда удара не работает правильно?

Я ввожу эту команду:

sh -c "echo '!a'"

Это дает ошибку

bash !a': event not found

Это несколько вследствие того, что! специальный символ, но так как я включаю в одинарные кавычки, я не должен получать это.

0
задан 25 July 2018 в 10:17

2 ответа

Восклицательный знак используется для извлечения вашей истории bash .

В вашем случае сообщение об ошибке исходит от текущей оболочки, а не от оболочки, которую вы хотите запустить (*). Что происходит, так это то, что одинарные кавычки не учитываются, поскольку для вашей текущей оболочки они находятся внутри двойных кавычек и поэтому теряют свой особый статус и являются простыми символами. Но внутри двойных кавычек расширение истории с помощью ! все еще работает ...

Если вы сделаете это по-другому: sh -c 'echo "!a"', то это сработает, потому что внешние одинарные кавычки «скрывают» ! .

(*) Вы получите ту же ошибку, если заменить sh на echo: echo -c "echo '!a'"

3
ответ дан 28 October 2019 в 07:02

! зарезервированное слово; здесь часть sh руководства:

Зарезервированные слова

Зарезервированные слова являются словами, которые имеют особое значение к оболочке и распознаны в начале строки и после оператора управления. Следующее является зарезервированными словами:

       !       elif    fi      while   case
       else    for     then    {       }
       do      done    until   if      esac

Если Вы хотите распечатать зарезервированные слова как символ:

sh -c "echo '"\!"a'"

Смотрите на sh/bash руководство!

0
ответ дан 28 October 2019 в 07:02

Другие вопросы по тегам:

Похожие вопросы: