EDIT: замена команды не требуется для удивительного поведения, хотя это наиболее распространенный вариант использования. Тот же вопрос относится только к echo "'!b'"
b=a
# Enable history substitution.
# This option is on by default on interactive shells.
set -H
echo '!b'
# Output: '!b'
# OK. Escaped by single quotes.
echo $(echo '!b')
# Output: '!b'
# OK. Escaped by single quotes.
echo "$(echo '$b')"
# Output: '$b'
# OK. Escaped by single quotes.
echo "$(echo '!b')"
# Output: history expands
# BAD!! WHY??
- В последнем примере, что является лучшим способом избежать
!
? - Почему это не удалось избежать, даже если я использовал одинарные кавычки, тогда как
echo "$(echo '$b')"
был? В чем разница между!
и$
? - Почему работала
echo $(echo '!b')
(без кавычек)? (указана @MBlanc).
Я бы предпочел сделать это без:
-
set +H
, так как мне понадобитсяset -H
, чтобы сохранить состояние оболочки -
escape-обратные сбрасывания, потому что для каждого
!
он нужен один, и он должен быть вне кавычек:echo "$(echo '\!a')" # '\!a'. # No good. echo "$(echo 'a '\!' b '\!' c')" # a ! b ! c # Good, but verbose.
-
echo $(echo '!b')
(без кавычек), потому что команда может возвращать пробелы.
Версия:
bash --version | head -n1
# GNU bash, version 4.2.25(1)-release (i686-pc-linux-gnu)