Короткий ответ
Запустите скрипт с помощью 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
этот ответ, потому что его легче читать .
, но для максимальной совместимости .
следует использоваться.