Ваш первый скрипт не меняет каталог. Я не знаю, что заставляет вас думать, что это происходит, но cd
внутри исполняемого скрипта никогда не повлияет на родительскую оболочку. Вот как это работает.
Единственный способ, которым он может изменить каталог родительской оболочки, - это если вы используете его вместо того, чтобы выполнять. Я сохранил ваш первый скрипт как foo.sh
и запустил его из моего $HOME
:
$ pwd
/home/terdon
$ foo.sh 1
/home/terdon/code/mydir-1.6_
$ pwd
/home/terdon
Как видите, каталог изменяется внутри скрипта, но PWD родительской оболочки остается неизменным. Теперь, если вы найдете его, он работает так, как вы ожидаете:
$ . ~/scripts/foo.sh
bash: [: =: unary operator expected
/home/terdon/code/mydir
$ pwd
/home/terdon/code/mydir
Итак, если вы хотите, чтобы ваш скрипт изменил каталог своей родительской оболочки, вам нужно, чтобы исходный код не выполнял его. Однако, если вы пытаетесь это сделать, вы хотите написать функцию, а не скрипт:
changeDir(){
targetDir="mydir"
if [ "$1" = "1" ]; then
targetDir="mydir-1.6_"
fi
\cd "$targetDir"
}
Добавьте вышеупомянутое в ваш ~/.bashrc
и используйте его вместо скрипта. Функции всегда влияют на оболочку, которая их запускает, поэтому она изменит ваш каталог так, как вы этого хотите.
Обратите внимание, что я использую \cd
вместо cd
. Это в случае, если ваш cd
связан с чем-то . Также обратите внимание, что я немного изменил ваш скрипт, чтобы избежать bash: [: =: unary operator expected
вы получаете с вашим первоначальным подходом. В сценариях оболочки важно всегда заключать в кавычки ваши переменные. В этом случае, когда $1
был пуст, скрипт пытался запустить:
$ if [ = 1 ]; then targetDir="mydir-1.6_"; fi
bash: [: =: unary operator expected
Что, конечно, выдает ошибку, поскольку сравнивать нечего. Цитируя $1
вы сравниваете пустую строку, и она будет работать как положено.