Alterando o diretório de trabalho do script pai do script 'sourced'

2

Eu quero alterar o diretório de trabalho do meu script por outro script que foi incluído.

Primeiro script:

#!/bin/bash
pwd
source script2
pwd

Roteiro Sedond:

cd ..
pwd

O resultado é o seguinte:

> ./script1
/home/sebi/testdir1/testdir2  # 1st script
/home/sebi/testdir1           # 2nd script
/home/sebi/testdir1           # 1st script

Eu editei a questão enquanto testava este script e ele funcionava como eu queria, mas seguir o script funciona de maneira diferente, pois o subscrito termina o executor pai está no mesmo diretório que era antes da invocação do subscrito.

#!/bin/bash
while :
do
sleep 5  

cat /home/.../shelldata.txt >> /home/.../gmodshell #logging

((source /home/..../shelldata.txt) 2>&1) | \
sed -e "s/..shellRunner.sh..line../SH/" > \
/home/..../shellFeedback.txt

echo > /home/..../shelldata.txt

done

O objetivo inteiro é acessar o bash usando arquivos para que eu possa escrever o comando em um arquivo e depois de um tempo eu recebo a saída em outro arquivo.

    
por Sebi 08.06.2011 / 14:34

5 respostas

5

Supondo que os scripts 1 e 2 estejam no mesmo diretório, tente criar o script 1:

#!/bin/bash
pwd
. ./script2
pwd

Colocando o ponto antes da chamada para o script (estou falando do primeiro ponto, não do ponto que faz parte do caminho do arquivo para o script que você deseja chamar) diz ao shell "Execute o seguinte script em este processo ao invés de gerar um novo processo para ele. "

As ações realizadas no segundo script (como o cd-ing ou a configuração de variáveis) persistirão após o término do segundo script.

    
por 08.06.2011 / 15:18
2

Da documentação de bash :

Command substitution, commands grouped with parentheses, and asynchronous commands are invoked in a subshell environment that is a duplicate of the shell environment, except that traps caught by the shell are reset to the values that the shell inherited from its parent at invocation. Builtin commands that are invoked as part of a pipeline are also executed in a subshell environment. Changes made to the subshell environment cannot affect the shell's execution environment.

Portanto, você deve evitar colocar parênteses ao obter um arquivo com o comando . (dot) (como mencionado em esta resposta ).

    
por 08.06.2011 / 15:26
1

Isso não é específico para o fornecimento de um script. Você obteria exatamente o mesmo resultado com um único script. Experimente:

#!/bin/bash
pwd
cd ..
pwd

A razão para isto é que um script lançado é executado em um subshell. Quando o script retorna, o subshell é fechado e você retorna ao seu shell original, onde quer que esteja no script.

Se você quiser que um comando o deixe em outro diretório, use um alias ou uma função bash:

function script1 () { cd ..; }
    
por 08.06.2011 / 14:41
1

Não faz sentido usar o comando source se você fizer isso em um subshell como em seu segundo script:

((source /home/..../shelldata.txt) 2>&1) | \

Além disso, shelldata.txt é realmente um script de shell, então dar a ele uma extensão .txt, embora não seja proibido, é confuso.

Finalmente, ajudaria se você dissesse o que o shelldata.txt contém para descobrir como responder à sua pergunta.

    
por 08.06.2011 / 16:00
0

Você poderia usar o script de origem para definir uma variável e fazer com que a variável original faça a mudança com base no conteúdo da variável, em vez de fazer a alteração diretamente no script de origem?

    
por 08.06.2011 / 14:39