Короткий ответ
Запустите скрипт с помощью sourceили .:
source ./script_name.sh
или
. ./script_name.sh
Последний немного более совместим для разных оболочек.
Длинный ответ
Этот вопрос подчеркивает важный момент, который заключается в том, что сценарии оболочки запускаются в своем собственном контексте. Чтобы увидеть, что это значит, рассмотрим следующий сценарий оболочки:
#!/bin/bash
cd /
ls
Если вы запустите это, вы получите что-то вроде этого:
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
Но вы заметите, что после запуска сценария вы по-прежнему находитесь в том каталоге, в котором находились до запуска: cd /внутренний сценарий фактически не влиял на ваш сеанс - он влиял только на контекст, в котором выполнялся сценарий, что создается для запуска сценария и уничтожается после его возврата.
Команда sourceбудет «читать и выполнять команды из аргумента имени файла в текущем контексте оболочки», так что любые команды, как cdвнутри, будут влиять на ваш текущий сеанс. Если бы вы запустили приведенный выше сценарий, передав его sourceвам, вы обнаружите, что вы оказались в корневом каталоге после его запуска .
В этом случае проблема в том, что historyкоманда выдает историю текущего контекста оболочки; контекст оболочки, в котором ваш скрипт запускается без использования, sourceне имеет истории, поэтому он ничего не записывает в выходной файл. Если вы используете sourceего, он будет работать в правильном контексте и будет работать как положено.
NB: sourceвстроенная оболочка, а не программа как таковая - в Bash sourceявляется синонимом ., но в некоторых оболочках .будет работать только - я использовал sourceэтот ответ, потому что его легче читать ., но для максимальной совместимости .следует использоваться.