На этот вопрос уже есть ответ здесь:
Я больше не могу использовать cd
при использовании его в сценарии bash
[~/Downloads] # cat cd-backward
#!/bin/bash
cd ..
[~/Downloads] # ./cd-backward
[~/Downloads] #
я должен перейти к ~
в последней строке.
cd
странно работает в терминале. Ничего не происходит, например, когда я запускаю bash -c 'cd Download
.
Каждый сценарий выполняется в его собственном subshell
, который является отдельным процессом, который не может изменить его родитель рабочий каталог. Единственный способ изменить рабочий каталог с помощью сценария, записанного в файл, получает его с помощью .
или source
(они эквивалентны) как это:
$ . cd-backward
или
$ source cd-backward
Примечание, что в таком случае Вам даже не нужно shebang
(#!/bin/bash
) наверху Вашего сценария.
При запуске сценария он работает в его собственная оболочка как Arkadiusz, уже упомянутый. В этом случае у Вас есть экземпляр bash
. Вы видите его при изменении сценария:
#!/bin/bash
cd ..
pwd
Образец работает на моей системе, дает:
bash-4.3$ pwd
/home/xieerqi/Downloads
bash-4.3$ ./cd-backward
/home/xieerqi
bash-4.3$ pwd
/home/xieerqi/Downloads
Соответственно достаточно, в подоболочке сценария, Вы перешли к корневому каталогу. Породите текущий рабочий каталог оболочки, однако остается неизменным
Ваш процесс (названный $
) имеет "Текущий каталог", ~/Downloads
.
, Когда Вы ./cd-backward
, тот скрипт Bash запущен в его собственном процессе, который имеет его собственный "Текущий каталог", который начинается как ~/Downloads
.
cd ..
влияние "Текущий каталог" эти ./cd-backward
процесс, изменяя его на ~
, но не влияя на "Текущий каталог" Вашего исходного процесса.
./cd-backward
концы, о его выходах процесса, и эти cd ..
забывают.
Вот два способа, которыми я влияю на свой собственный "Текущий каталог", удержанный мой '~/.bashrc':
Первый, несколько alias
es:
alias ..='cd ..'
alias ...='cd .. ; cd ..'
Вот то, как я сохраняю свой текущий каталог в моем Заголовке окна (посредством прерывания cd
):
# from the "xttitle(1)" man page - put info in window title
update_title()
{
[[ $TERM = xterm ]] || [[ $TERM = xterm-color ]] && xttitle "[$] ${USER}@${HOSTNAME}:$PWD"
}
cd()
{
[[ -z "$*" ]] && builtin cd $HOME
[[ -n "$*" ]] && builtin cd "$*"
update_title
}