Изменение каталога в скрипте не приводит к изменению каталога. Почему?

Изменение каталога в скрипте не приводит к изменению каталога. Почему?

я виделэтот ответс тех пор как искал это, но изначально я написал этот скрипт:

for i in `seq 1 $1`; 
   do cd ../;
done;

Он не меняет каталог. Почему это, работает как

./updir.sh 5

решение1

Запуск скрипта, как вы показываете, создает копию среды в подоболочке, и любые вносимые вами изменения, такие как настройка каталогов или переменных среды, влияют только на эту среду подоболочки, а не на вызывающую оболочку.

Чтобы внести изменения в текущую оболочку из скрипта, необходимо запустить скрипт в текущей оболочке с помощью команды sourceили .:

. ./updir.sh 5

Вы можете сделать это автоматически с помощью псевдонима:

alias updir='. ./updir.sh'

В качестве альтернативы вы можете использовать функцию вместо скрипта:

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

решение2

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

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

Связанный контент