В моем файле bash я попросил перейти к некоторому подкаталогу, разархивировать файл и остаться там, но когда я набираю pwd, я вижу, что я всегда возвращаюсь домой dir. Зачем ?
Любой способ получить оболочку придерживаться subdir?
В моем файле bash я попросил перейти к некоторому подкаталогу, разархивировать файл и остаться там, но когда я набираю pwd, я вижу, что я всегда возвращаюсь домой dir. Зачем ?
Любой способ получить оболочку придерживаться subdir?
Выполнение скрипта запускает его в отдельном процессе. Изменения в рабочем каталоге, переменных среды и т.д. Теряются при выходе из сценария.
Для выполнения скрипта в текущем процессе bash вам необходимо создать скрипт
. myscript.sh
Когда вы запускаете скрипт, он открывает для него новый подоболочек, таким образом не меняя переменные среды (включая ваш рабочий каталог: $ PWD) оболочки, в которой вы находитесь. Если вы хотите, чтобы скрипт выполнялся в той же оболочке, что и вы, сохраняя при этом изменения в переменных среды, которые он делает, используйте его вместо выполнения. Как это:
source my-script
или же:
. my-script
Это, однако, оставит позади все временные переменные, которые использует ваш скрипт. Если вы хотите избежать этого, создайте в скрипте функцию и объявите все временные переменные локальными. Как это:
function main()
{
local var1=whatever
cd /path/to
do-something
...
}
main
Это, когда вызывается с source
, оставит позади все изменения переменных, как рабочий каталог, но не оставит временные переменные позади.
Да, вы можете создать функцию для этого. Сначала создайте скрипт, который выполняет всю тяжелую работу.
Затем создайте функцию в .bashrc примерно так:
xcd () {
local archive="$1" dir="$2"
your_script "$archive"
cd "$dir"
}
В отличие от целых скриптов, функции выполняются в контексте текущей оболочки.
Ваш bash-скрипт наследует копию среды вызывающей оболочки (рабочий каталог, переменные оболочки и т.д.), Которая отбрасывается при выходе из скрипта. Если вы протестируете какие-либо переменные оболочки, например, введя «echo $ foo», они сохранят любое значение (или не будут существовать), которое они имели до того, как вы запустили скрипт, как это делал pwd.