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

37

Eu só quero escrever um script que mude meu diretório .

Eu coloco os comandos abaixo no arquivo /home/alex/pathABC

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

eu fiz chmod +x pathABC .

No terminal, enquanto em /home/alex , executo ./pathABC , mas a saída é apenas HelloWorld e o diretório atual não é alterado.

Então, o que está errado?

    
por Mohammad Reza Rezwani 11.06.2014 / 10:35

4 respostas

69

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 shell 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 executando-o a partir do 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 segundo script seria executado a partir do novo diretório.

HelloWorld 

é apenas a saída do script.

    
por Jacob Vlijm 11.06.2014 / 10:48
0

Como olá mundo é apenas uma instrução de rastreamento, vamos tentar isto:

Crie o arquivo de script bash cd.sh contendo:

#!/bin/bash
echo "/home/mike/Documents/A/B/C"
  • A extensão .sh é uma convenção mais antiga de dar a nomes de arquivos de script bash uma extensão. É puramente cosmético e geralmente desnecessário. No entanto, neste caso, é importante diferenciar do comando core cd .

Marque o executável do arquivo de script bash usando:

chmod a+x cd.sh

Agora, execute o arquivo:

$ cd $(./cd.sh)
bash: cd: /home/alex/Documents/A/B/C: No such file or directory
  • cd todos nós sabemos.
  • $(...) executa o comando entre parênteses e retorna a saída.
  • Se cd.sh estava em seu caminho, você não precisa especificar onde está. Prefixamos com ./ para especificar se o comando está no diretório atual.
  • A saída echo do script cd.sh é enviada de volta para o pai por meio do $(...) . O pai (nosso prompt de shell) usa essa saída e a transmite para o comando cd do Linux.

Como outros mencionaram, um processo filho não pode alterar o diretório do pai. Essa é uma maneira pela qual a criança pode dizer aos pais para onde ir após o término do processo.

    
por WinEunuuchs2Unix 25.07.2018 / 00:08