Por que o “cd” não funciona em um script de shell?

36

O que há de errado com esse roteiro fácil? Eu só quero escrever um script que mude meu diretório :

Eu coloco os comandos abaixo no arquivo cujo nome é pathABC no diretório /home/alex ,

#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld

também fiz chmod +x pathABC , no terminal quando estou no diretório /home/alex ,  Eu corro ./pathABC .

Mas a saída é apenas HelloWorld e o diretório atual permanece sem alteração. Quero dizer, meu diretório permanece como /home/alex e não vai para o /home/alex/Documents/A/B/C .

Então, onde está errado?

    
por Mohammad Reza Rezwani 11.06.2014 / 10:35

3 respostas

66

Como os outros explicaram, o diretório é alterado no processo filho do seu script, e não no processo terminal do qual o script é chamado. Depois que o processo filho morre, você está de volta ao terminal que está onde estava.

Várias alternativas:

1. Link simbólico

Coloque um link simbólico em sua casa no caminho longo que você deseja acessar com facilidade

$ ln -s /home/alex/Documents/A/B/C ~/pathABC

acesse o diretório com:

$ cd ~/pathABC

2. Alias ​​

Coloque um alias em seu ~ / .bashrc:

alias pathABC="cd /home/alex/Documents/A/B/C"

(de aqui )

3. Função

Crie uma função que altere o diretório, a função seja executada no processo do seu terminal e, em seguida, altere seu diretório.

(de aqui )

4. Evite correr como criança

Crie seu script em vez de executá-lo. O fornecimento (feito por . ou source ) faz com que o script seja executado no mesmo shell em vez de ser executado em sua própria sub-rede.

$ . ./pathABC

(de aqui e aqui )

5. Variáveis ​​de cd

Defina a opção cdable_vars no seu ~/.bashrc e crie uma variável de ambiente para o diretório:

shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"

Então você pode usar cd pathABC

(de aqui )

    
por Gauthier 11.06.2014 / 11:33
7

Quando você executa o script em um terminal, um processo filho é executado. Neste programa filho, ou seja, seu script será alterado para qualquer diretório especificado. Mas no processo pai ou seja, onde você executa o script ainda está no caminho antigo. OU simplesmente podemos dizer:

The scope of cd command is only for child process not parent

    
por Tingrammer 11.06.2014 / 10:56
4

Você está cometendo um erro de pensamento. Enquanto o atual terminal permanece no mesmo diretório, o script foi movido para o novo diretório.

Você pode ver isso criando outro script no diretório novo e adicionando-o ao seu script, depois de alterar o diretório:

#!/bin/sh
cd /home/alex/Documents/A/B/C&&./another_script.sh (if it is executable)

O script (segundo) seria executado a partir do novo diretório.

HelloWorld 

é apenas a saída do script.

    
por Jacob Vlijm 11.06.2014 / 10:48