Eu só quero escrever um script que mude 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 estiver dentro /home/alex
, corro ./pathABC
, mas a saída é justa HelloWorld
e o diretório atual não é alterado.
Então o que está errado?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
fonte
fonte
Respostas:
Como outros explicaram, o diretório é alterado no processo filho do seu script, não no processo terminal 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 no caminho longo que você deseja acessar facilmente
em seguida, acesse o diretório com:
2. Alias
Coloque um alias no seu ~ / .bashrc:
( daqui )
3. Função
Crie uma função que altera o diretório, a função é executada no processo do seu terminal e pode alterar seu diretório.
( daqui )
4. Evite correr quando criança
Crie seu script em vez de executá-lo. O fornecimento (feito por
.
ousource
) faz com que o script seja executado no mesmo shell em vez de ser executado em seu próprio subshell.( daqui e aqui )
5. vars compatíveis com CD
Defina a
cdable_vars
opção no seu~/.bashrc
e crie uma variável de ambiente para o diretório:Então você pode usar
cd pathABC
( daqui )
fonte
source
! Eu sempre me perguntei por que eu façosource .bashrc
e nãobash .bashrc
cd $pathABC
?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
fonte
. pathABC
ousource pathABC
.Você está cometendo um erro de raciocínio. Enquanto o shell atual permanece no mesmo diretório, o script foi movido para o novo diretório.
Você pode ver isso criando outro script no novo diretório e executando-o a partir do seu script, depois que ele mudou de diretório:
O segundo script seria executado a partir do novo diretório.
é apenas a saída do script.
fonte
pwd
no novo diretório, em vez de adicionar um script totalmente novo à situação.Como o hello world é apenas uma declaração de rastreamento, vamos tentar o seguinte:
Crie um arquivo de script bash
cd.sh
contendo:.sh
extensão é uma convenção antiga de atribuir uma extensão aos nomes de arquivos do script bash. É puramente cosmético e geralmente desnecessário. No entanto, neste caso, é importante diferenciar docd
comando principal .Marque o arquivo de script bash como executável usando:
Agora execute o arquivo:
cd
todos nós sabemos.$(...)
executa o comando entre parênteses e retorna a saída.cd.sh
estava no seu caminho, você não precisa especificar onde está. Nós prefixamos com./
para especificar o comando no diretório atual.echo
saída docd.sh
script é enviada de volta ao pai via$(...)
. O pai (nosso prompt de shell) usa essa saída e a passa para ocd
comando Linux .Como outros já mencionaram, um processo filho não pode alterar o diretório dos pais. Essa é uma maneira pela qual a criança pode dizer aos pais para onde ir após o término do processo.
fonte
14.04
versão que li cerca de uma hora atrás?cd /home/mike/Documents/A/B/C
que não produzia nenhuma saída. Agora éecho "/home/mike/Documents/A/B/C"
, o que produz saída../cd.sh
, agora é,cd $(./cd.sh)
mas cumpre o objetivo da criança alterar o diretório atual dos pais. Sim, não é convencional, mas é outra maneira de fazer isso que espero que as pessoas achem interessantes.