`cd` не работает при использовании в сценарии bash [дубликат]

На этот вопрос уже есть ответ здесь:

Я больше не могу использовать cd при использовании его в сценарии bash

[~/Downloads] # cat cd-backward
#!/bin/bash
cd ..

[~/Downloads] # ./cd-backward
[~/Downloads] #

я должен перейти к ~ в последней строке.

cd странно работает в терминале. Ничего не происходит, например, когда я запускаю bash -c 'cd Download .

4
задан 20 April 2018 в 06:10

3 ответа

Каждый сценарий выполняется в его собственном subshell, который является отдельным процессом, который не может изменить его родитель рабочий каталог. Единственный способ изменить рабочий каталог с помощью сценария, записанного в файл, получает его с помощью . или source (они эквивалентны) как это:

$ . cd-backward

или

$ source cd-backward

Примечание, что в таком случае Вам даже не нужно shebang (#!/bin/bash) наверху Вашего сценария.

8
ответ дан 23 November 2019 в 11:41

При запуске сценария он работает в его собственная оболочка как 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

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

2
ответ дан 23 November 2019 в 11:41

Ваш процесс (названный $) имеет "Текущий каталог", ~/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
}
2
ответ дан 23 November 2019 в 11:41

Другие вопросы по тегам:

Похожие вопросы: