Да, расширение истории включено по умолчанию только для интерактивных оболочек.
Чтобы включить его для сценария оболочки, напишите:
set -H
Чтобы отключить его в интерактивной оболочке, напишите:
set +H
Чтобы определить, включено ли расширение истории в настоящее время, используйте некоторую форму следующего кода:
case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
Начав преподавать класс оболочки, я тщательно изучил руководство, чтобы выяснить, что такое «интерактивная оболочка». Это вопрос водоворота, поэтому позвольте мне избавить вас от некоторых неприятностей:
Оболочка имеет много вариантов. Некоторые из этих параметров инициализируются по-разному, когда оболочка имеет управляющий терминал (или когда запускается -i
, бла-бла, как угодно, см. Ниже).
ВСЕ параметры оболочки могут быть изменены индивидуально.
«Интерактивная оболочка» - это обманчивый термин, когда вы пытаетесь определить его точно. Это действительно просто набор настроек параметров.
На вопрос о том, какие настройки делают оболочку интерактивной или нет, невозможно ответить; это становится смешным. Это точно такой же философский вопрос, как и Корабль Тесея .
Если вы запускаете интерактивную оболочку, но затем отключаете расширение истории, используете --noediting
флаг, устанавливаете --norc
, выключаете expand_aliases
и т. Д. И т. Д., То в каком смысле оболочка является интерактивной? Или когда он перестает быть интерактивным? Вы не можете ответить на эти вопросы.
Правда в том, что «интерактивный» - это просто удобный ярлык для набора различных опций оболочки. Точно так же "неинтерактивный". То же самое; просто набор поведений, каждый из которых может быть изменен индивидуально.
Итог: оболочка ведет себя по-разному, когда она запускается "в интерактивном режиме", и когда она запускается "неинтерактивно". Попытки точно определить эти термины после запуска глупо. Просто посмотрите на каждый отдельный вариант оболочки, чтобы понять ее поведение.
Я забыл, что в дополнение к собственному исследованию я подробно об этом писал на этом сайте.