Как запустить 'cd' в сценарии оболочки и оставаться там после завершения сценария? - PullRequest
62 голосов
/ 07 октября 2010

Я использовал 'change directory' в моем сценарии оболочки (bash)

#!/bin/bash
alias mycd='cd some_place'
mycd
pwd

pwd печатает some_place правильно, но после завершения скрипта мой текущий рабочий каталог не меняется.

Можно ли изменить мой путь по сценарию?

Ответы [ 5 ]

77 голосов
/ 07 октября 2010

Вам необходимо получить исходный файл как:

. myfile.sh

или

source myfile.sh

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

14 голосов
/ 07 октября 2010

Скрипт запускается в отдельной подоболочке. Эта подоболочка изменяет каталог, а не оболочку, в которой вы ее запускаете. Возможное решение - source сценарий вместо его запуска:

# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
13 голосов
/ 07 октября 2010

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

Другой способ - реализовать скрипт как функцию в bash.

function cdbm() {
    cd whereever_you_want_to_go
     echo arguments to the functions were $1, $2, ...
}

Этот метод используется autojump: http://github.com/joelthelion/autojump/wiki, чтобы обеспечить вас обучающей оболочкойкаталог закладок.

3 голосов
/ 15 апреля 2014

Это может быть достигнуто путем поиска. Sourcing - это, в основном, выполнение сценария в той же оболочке, тогда как обычное выполнение (sh test.sh или ./test.sh) создаст вспомогательную оболочку и выполнит сценарий там.

test.sh

cd development/
ls
# Do whatever you want.

Выполнить test.sh на

source test.sh

. является кратчайшим обозначением для source. Так что вы также можете сделать по

. test.sh

Это выполнит скрипт и изменит каталог текущей оболочки на development/.

1 голос
/ 16 ноября 2011

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

Способ преодолеть это использование,

source yourscript.sh

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

...