1

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

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

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

./updir.sh 5

2 ответа2

5

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

Чтобы внести изменения в текущую оболочку из сценария, необходимо запустить сценарий в текущей оболочке с использованием 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
}

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