Por que depois de executar um arquivo bash estou sempre de volta ao diretório home?

1

No meu arquivo bash eu pedi para navegar para algum subdir, descompacte um arquivo e fique lá, mas quando eu digito pwd eu posso ver que eu estou sempre de volta ao diretório home. Por quê?

Qualquer maneira de colocar o shell stick no subdiretório?

    
por heavyd 11.04.2010 / 15:09

4 respostas

2

Quando você executa um script, ele abre um novo subshell para ele, não alterando as variáveis de ambiente (incluindo seu diretório de trabalho: $ PWD) do shell em que você está. Se desejar que o script seja executado no mesmo shell como você está, retendo assim as mudanças nas variáveis de ambiente que ele faz, fonte-lo em vez de executar. Assim:

source my-script

ou:

. my-script

Isso, no entanto, deixará para trás todas as variáveis temporárias usadas pelo seu script. Se você quiser evitá-lo, crie uma função dentro do script e declare todas as variáveis temporárias locais. Assim:

function main()
{
    local var1=whatever
    cd /path/to
    do-something
    ...
}

main

Isso, quando chamado com source , deixará para trás todas as mudanças de variáveis, como o diretório de trabalho, mas não deixará variáveis temporárias para trás.

    
por 11.04.2010 / 18:51
4

A execução de um script executa-o em um processo separado. Mudanças no diretório de trabalho, variáveis de ambiente, etc. são perdidas quando o script sai.

Para executar o script no processo bash atual, você precisa criar o script

. myscript.sh
    
por 11.04.2010 / 15:24
1

Sim, você pode criar uma função para fazer isso. Primeiro, crie um script que faça todo o trabalho pesado.

Em seguida, crie uma função em .bashrc assim:

xcd () {
    local archive="$1" dir="$2"

    your_script "$archive"
    cd "$dir"
}

Ao contrário dos scripts inteiros, as funções são executadas no contexto do shell atual.

Veja as FAQs da BASH para uma explicação .

    
por 11.04.2010 / 17:03
0

Seu script bash herda uma cópia do ambiente do shell invocador (pasta de trabalho, variáveis do shell, etc.), que é descartado quando o script é encerrado. Se você testar qualquer variável do shell, por exemplo, digitando "echo $ foo", eles terão retido qualquer valor (ou inexistente) que tivessem antes de você executar o script, assim como o pwd fez.

    
por 11.04.2010 / 15:39