Shell Script, который поднимается на N папок в файловой системе - PullRequest
1 голос
/ 25 августа 2009

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

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

#!/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 в терминале, и это сработало.

Не понимаю, почему эта же команда не работает в сценарии. Может ли это быть из соображений безопасности?

Есть предложения?

Ответы [ 5 ]

5 голосов
/ 25 августа 2009

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

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

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

up(){
    #code goes here
}

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

2 голосов
/ 25 августа 2009

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

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

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

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

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

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

2 голосов
/ 25 августа 2009

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

1 голос
/ 14 сентября 2009

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

LIMIT = $ 1
if [-z "$ LIMIT"]; то
LIMIT = 1
фи

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

1 голос
/ 05 сентября 2009

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

. cdup 3 
source cdup 3

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

...