'cd' não funciona se usado no script bash [duplicado]

3

Eu não posso mais usar cd quando usá-lo em um script bash

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

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

Eu devo passar para ~ na última linha.

cd funciona perfeitamente no terminal estranhamente. Nada acontece também quando executo bash -c 'cd Download , por exemplo.

    
por user123456 03.10.2016 / 19:39

3 respostas

7

Todo script é executado em seu próprio subshell , ou seja, um separado processo que não pode modificar seu diretório de trabalho pai . O único maneira de alterar um diretório de trabalho usando um script escrito em um arquivo é obtendo-o usando . ou source (eles são equivalentes) assim:

$ . cd-backward

ou

$ source cd-backward

Note que, nesse caso, você nem precisa de shebang ( #!/bin/bash ) no topo do seu script.

    
por Arkadiusz Drabczyk 03.10.2016 / 19:49
1

Quando você inicia um script, ele é executado no seu próprio shell , como Arkadiusz já mencionou. Nesse caso, você tem a instância de bash . Você pode vê-lo se modificar o script:

#!/bin/bash
cd ..
pwd

Execução de amostra no meu sistema:

bash-4.3$ pwd
/home/xieerqi/Downloads
bash-4.3$ ./cd-backward 
/home/xieerqi
bash-4.3$ pwd
/home/xieerqi/Downloads

Apropriadamente, dentro da sub-rotina de script, você navega para o diretório pessoal. O diretório de trabalho atual do shell pai, no entanto, permanece inalterado

    
por Sergiy Kolodyazhnyy 03.10.2016 / 19:57
1

Seu processo (chamado $$ ) tem um "diretório atual", ~/Downloads .

Quando você ./cd-backward , esse script Bash é executado em seu próprio processo, que possui seu próprio "Diretório Atual", que inicia como ~/Downloads .

O cd .. afeta o "diretório atual" do processo ./cd-backward , alterando-o para ~ , mas NÃO afetando o "diretório atual" do seu processo original.

./cd-backward termina, seu processo sai e o cd .. é esquecido.

Aqui estão duas maneiras de afetar o meu próprio "diretório atual", mantido em meu '~ / .bashrc':

Primeiro, alguns alias es:

alias ..='cd ..'
alias ...='cd .. ; cd ..'

Veja como eu mantenho meu diretório atual no título da minha janela (através da interceptação de 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
}
    
por waltinator 03.10.2016 / 19:58