Коротка відповідь
Запуск сценарію з 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його використовуєте, він буде виконуватися у правильному контексті та працюватиме як очікувалося.
Примітка: sourceвбудована оболонка, а не програма сама по собі - в Bash sourceє синонімом ., але в деяких оболонках .буде працювати тільки - я використовував sourceцю відповідь, тому що її легше читати, ніж .для максимальної сумісності .слід бути використаним.