
Eu só quero escrever um roteiro quemuda meu diretório.
Coloquei 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 estava em /home/alex
, executei ./pathABC
, mas a saída é justa HelloWorld
e o diretório atual não é alterado.
Então, o que há de errado?
Responder1
Como outros explicaram, o diretório é alterado no processo filho do seu script, não no processo terminal a partir do qual o script é chamado. Depois que o processo filho morre, você volta ao terminal, que fica onde estava.
Várias alternativas:
1. Link simbólico
Coloque um link simbólico em sua casa para o caminho longo que você deseja acessar facilmente
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
então acesse o diretório com:
$ cd ~/pathABC
2. Alias
Coloque um alias em seu ~/.bashrc:
alias pathABC="cd /home/alex/Documents/A/B/C"
(deaqui)
3. Função
Crie uma função que altera o diretório, a função é executada no processo do seu terminal e pode então alterar seu diretório.
(deaqui)
4. Evite correr quando criança
Crie seu script em vez de executá-lo. O sourcing (feito por .
ou source
) faz com que o script seja executado no mesmo shell em vez de ser executado em seu próprio subshell.
$ . ./pathABC
5. vars compatíveis com CD
Defina a cdable_vars
opção em 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 usarcd pathABC
(deaqui)
Responder2
Quando você executa o script em um Terminal, um processo filho é executado. Neste programa filho, ou seja, seu script mudará 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:
O escopo do comando cd é apenas para processo filho, não pai.
Responder3
Você está cometendo um erro de pensamento. Enquanto o atualconchapermanece no mesmo diretório, oroteirofoi movido para o novo diretório.
Você pode ver isso criando outro script nonovodiretório e executá-lo a partir do seu script, após 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 no novo diretório.
HelloWorld
é apenas a saída do script.
Responder4
Usar $SHELL
no final
Um script bash opera em seu ambiente atual ou em seus filhos, mas nunca em seu ambiente pai.
No entanto, esta pergunta é frequentemente feita porque se querpara ser deixado em um prompt de comando em um determinado diretório após a execuçãode um script de outro diretório.
Se for esse o caso, bastaexecutar uma $SHELL
instância filhano final do roteiro:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
Para retornar à instância anterior do shell parental, use Ctrl+ D.