1

В моем файле bash я попросил перейти к некоторому подкаталогу, разархивировать файл и остаться там, но когда я набираю pwd, я вижу, что я всегда возвращаюсь домой dir. Зачем ?

Любой способ получить оболочку придерживаться subdir?

4 ответа4

4

Выполнение скрипта запускает его в отдельном процессе. Изменения в рабочем каталоге, переменных среды и т.д. Теряются при выходе из сценария.

Для выполнения скрипта в текущем процессе bash вам необходимо создать скрипт

. myscript.sh
2

Когда вы запускаете скрипт, он открывает для него новый подоболочек, таким образом не меняя переменные среды (включая ваш рабочий каталог: $ PWD) оболочки, в которой вы находитесь. Если вы хотите, чтобы скрипт выполнялся в той же оболочке, что и вы, сохраняя при этом изменения в переменных среды, которые он делает, используйте его вместо выполнения. Как это:

source my-script

или же:

. my-script

Это, однако, оставит позади все временные переменные, которые использует ваш скрипт. Если вы хотите избежать этого, создайте в скрипте функцию и объявите все временные переменные локальными. Как это:

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

main

Это, когда вызывается с source , оставит позади все изменения переменных, как рабочий каталог, но не оставит временные переменные позади.

1

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

Затем создайте функцию в .bashrc примерно так:

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

    your_script "$archive"
    cd "$dir"
}

В отличие от целых скриптов, функции выполняются в контексте текущей оболочки.

Смотрите BASH FAQ для объяснения.

0

Ваш bash-скрипт наследует копию среды вызывающей оболочки (рабочий каталог, переменные оболочки и т.д.), Которая отбрасывается при выходе из скрипта. Если вы протестируете какие-либо переменные оболочки, например, введя «echo $ foo», они сохранят любое значение (или не будут существовать), которое они имели до того, как вы запустили скрипт, как это делал pwd.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .