Usar $SHELLno final

Usar $SHELLno final

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 HelloWorlde 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

(deaquieaqui)

5. vars compatíveis com CD

Defina a cdable_varsopção em seu ~/.bashrce 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 $SHELLno 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 $SHELLinstâ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.

informação relacionada