Чому після запуску bash-файлу я завжди повертаюся до домашньої директорії?


1

У моєму файлі bash я попросив перейти до деякого піддиректорії, розпакувати файл і залишитися там, але коли я пишу pwd, я бачу, що я завжди повертаюся до dir. Чому?

Будь-який спосіб отримати shell stick до subdir?


Дивіться також: superuser.com/questions/176783/…
lesmana

Відповіді:


2

Коли ви запускаєте скрипт, він відкриває для неї нову підшарку, таким чином не змінюючи змінні середовища (включаючи ваш робочий каталог: $ PWD) оболонки, в якій ви перебуваєте. , таким чином зберігаючи зміни в змінних середовища, які він робить, джерело його замість виконання. Подобається це:

source my-script

або:

. my-script

Це, однак, залишить кожну тимчасову змінну, яку використовує ваш сценарій. Якщо ви хочете цього уникнути, створіть функцію в скрипті і оголосіть всі тимчасові змінні локально. Подобається це:

function main()
{
    local var1=whatever
    cd /path/to
    do-something
    ...
}

main

Це, коли дзвонять з source, залишить всі зміни змінної, як робочий каталог, але не залишить тимчасових змінних.


+1 для вказівки на "змінний залишок" і деталізації рішення для цього.
DevSolar

4

Виконання сценарію виконується окремим процесом. Зміни в робочому каталозі, змінних середовища тощо втрачаються при виході з скрипта.

Щоб виконати скрипт у поточному процесі bash, потрібно створити скрипт

. myscript.sh

Тоді чи є спосіб дати їй знати, що я хочу залишитися там, де я був?


1

Так, ви можете створити функцію для цього. Спочатку створіть скрипт, який виконує всю важку роботу.

Потім створіть функцію в .bashrc так:

xcd () {
    local archive="$1" dir="$2"

    your_script "$archive"
    cd "$dir"
}

На відміну від цілих скриптів, функції виконуються в контексті поточної оболонки.

Див. Роз'яснення по BASH FAQ .


0

Ваш скрипт bash успадковує копію середовища, що викликає оболонку (робочий каталог, змінні оболонки і т.д.), який відкидається, коли скрипт завершується. Якщо ви перевіряєте будь-які змінні оболонки, наприклад, ввівши "echo $ foo", вони зберегли б будь-яке значення (або не існують) до того, як ви запустили скрипт, як і pwd.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.