Shell Script, который увеличивает N папок в файловой системе

Я только что нашел этот очень полезный shell script здесь, на SO, но, к сожалению, он не работает в Mac OS X 10.5.

Это script (скопировано для удобства):

#!/bin/bash
LIMIT=$1
P=$PWD
for ((i=1; i <= LIMIT; i++))
do
    P=$P/..
done
cd $P

Я попытался echo $P в самом конце и вернул правильный путь, но все же cd $P, похоже, не работает.

Итак, я попытался вручную ввести P="some/path" и cd $P в терминал, и он сработал.

Я не понимаю, почему одна и та же команда не работает в script. Это может быть безопасность?

Любые предложения?

Ответ 1

У меня была такая же проблема в Linux, на самом деле, если я правильно понял, что нашел после некоторого поиска, вот что происходит:

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

Я решил это, поставив этот полезный script в мой .bashrc как функцию, например:

up(){
    #code goes here
}

Другой вариант - это источник script при каждом его запуске, но я предпочитаю первый.

Ответ 2

после завершения оболочки script он вернет вас обратно в каталог, из которого он был выполнен. Cd будет влиять только на cwd процесса script

Ответ 3

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

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

например. введите следующий

up() { LIMIT=$1; P=$PWD; for ((i=1; i <= LIMIT; i++)); do P=$P/..; done; cd $P; }

и вы определите команду вверх, которая будет работать так, как вы планировали.

Вы можете поместить это определение функции в файл, полученный при входе в систему, например,.bashrc, чтобы он удобно определялся при входе в систему.

Ответ 4

Если вы хотите запустить script в контексте текущей оболочки, просто выполните одно из следующих действий (предполагая, что ваша оболочка script называется cdup)

. cdup 3 
source cdup 3

Исходная команда (и ее псевдоним.) запускает предоставленный script в контексте вашей текущей оболочки, то есть не запускает отдельную под-оболочку для запуска команды, поэтому ваш компакт-диск будет работать так, как только он находится в пределах текущая оболочка

Ответ 5

Небольшое дополнение к функции up(); добавьте тест без значения:

LIMIT = $1
если [-z "$ LIMIT" ]; то
  ПРЕДЕЛ = 1
ц

и не более "cd.." - просто "вверх"