Відповіді:
Коли ви запускаєте скрипт, він відкриває для неї нову підшарку, таким чином не змінюючи змінні середовища (включаючи ваш робочий каталог: $ PWD) оболонки, в якій ви перебуваєте. , таким чином зберігаючи зміни в змінних середовища, які він робить, джерело його замість виконання. Подобається це:
source my-script
або:
. my-script
Це, однак, залишить кожну тимчасову змінну, яку використовує ваш сценарій. Якщо ви хочете цього уникнути, створіть функцію в скрипті і оголосіть всі тимчасові змінні локально. Подобається це:
function main()
{
local var1=whatever
cd /path/to
do-something
...
}
main
Це, коли дзвонять з source, залишить всі зміни змінної, як робочий каталог, але не залишить тимчасових змінних.
Виконання сценарію виконується окремим процесом. Зміни в робочому каталозі, змінних середовища тощо втрачаються при виході з скрипта.
Щоб виконати скрипт у поточному процесі bash, потрібно створити скрипт
. myscript.sh
Так, ви можете створити функцію для цього. Спочатку створіть скрипт, який виконує всю важку роботу.
Потім створіть функцію в .bashrc так:
xcd () {
local archive="$1" dir="$2"
your_script "$archive"
cd "$dir"
}
На відміну від цілих скриптів, функції виконуються в контексті поточної оболонки.
Ваш скрипт bash успадковує копію середовища, що викликає оболонку (робочий каталог, змінні оболонки і т.д.), який відкидається, коли скрипт завершується. Якщо ви перевіряєте будь-які змінні оболонки, наприклад, ввівши "echo $ foo", вони зберегли б будь-яке значення (або не існують) до того, як ви запустили скрипт, як і pwd.