Пребывание в каталоге изменилось после окончания скрипта bash - PullRequest
6 голосов
/ 16 декабря 2010

Мой bash-скрипт:

#!/bin/bash
cd /tmp

Перед запуском моего скрипта:

pwd: /

После запуска моего скрипта:

pwd: /

После запуска моего скрипта через его источник:

pwd: /tmp

Как я могу остаться на пути из сценария, не используя его?

Ответы [ 6 ]

11 голосов
/ 16 декабря 2010

Вы не можете.Изменения в текущем каталоге влияют только на текущий процесс.

5 голосов
/ 16 декабря 2010

Позвольте мне подробнее остановиться на этом:

Когда вы запускаете сценарий, bash создает для него новый процесс, и изменения в текущем каталоге влияют только на этот процесс.

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

Итак, как указал Игнасио, этоне может быть сделано

2 голосов
/ 16 декабря 2010

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

#!/bin/bash
...
cd /
exec bash
1 голос
/ 16 декабря 2010

Вот глупая идея. Используйте PROMPT_COMMAND. Например:

$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE'
$ export CDFILE=/tmp/cd.$$

Затем сделайте последнюю строку вашего скрипта 'pwd> $ CDFILE'

1 голос
/ 16 декабря 2010

Если вам действительно нужно такое поведение, вы можете заставить свой скрипт возвращать каталог, а затем использовать его каким-либо образом. Что-то вроде:

#!/bin/bash
cd /tmp
echo $(pwd)

и тогда вы можете

cd $(./script.sh)

Ужасно, но делает этот трюк в этом простом случае.

0 голосов
/ 16 декабря 2010

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

md() { mkdir -p "$1" && cd "$1"; }

У меня есть выше в моем ~ / .bashrc

...