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