Когда Вы запускаете скрипт, он открывает новую подоболочку для него, таким образом не изменяя переменные среды (включая Ваш рабочий каталог: $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"
}
В отличие от целых сценариев, функции выполняются в контексте текущей оболочки.
Ваш сценарий удара наследовал копию среды оболочки вызова (рабочий dir, переменные оболочки, и т.д.), который отбрасывается, когда сценарий выходит. Если Вы тестируете какие-либо переменные оболочки, например, путем ввода "$foo эха", они сохранят любое значение (или не существуют), они имели, прежде чем Вы запустили скрипт, как pwd сделал.