cd no script bash sem alias, function, source [duplicado]

1

Eu tenho um pequeno problema e espero que alguém possa me ajudar. Eu escrevi um script bash que deve cd me para um diretório.

Meu problema é que apenas o diretório na subshell muda.

Já li sobre muitos problemas semelhantes, mas quero saber se existe uma solução além usando um alias, uma função ou o script.

Se você não entende o que quero dizer, aqui está um exemplo:

user@linux ~: cat ./myscript.sh
#!/bin/bash
cd /any/directory
user@linux ~: ./myscript.sh
user@linux ~: 

Por favor, note que o meu script é muito mais longo, então eu não quero usar uma função!

    
por OneStackOverflowUser 07.01.2016 / 12:31

2 respostas

1

Se você quiser que o comando cd tenha efeito em seu shell atual, você deve executar o script no shell atual, porque as alterações no shell filho não são propagadas de volta ao shell pai.

      $ pwd
      /afs/user/i/ahmad
      $ cat test1
        #!/bin/bash
        cd /etc
      $ . test1           #runs test1 in current shell even if its not executable
      $ pwd
      /etc

Usando echo e eval:

Usando o eval no shell pai. Nos comandos echo do shell script você quer executar pelo shell pai:

echo "cd $filepath"

No shell pai, você pode chutar o script de shell com eval:

  eval 'sh foo.sh'

Exemplo:

  $ cat test1.sh 
   #!/bin/bash
   echo "cd /etc"

  $ eval 'sh test1.sh'
  $ pwd
  /etc
    
por 07.01.2016 / 12:46
0

Quando você executa os scripts, ele inicia um processo separado, com seus próprios parâmetros, funções, etc. Esse processo herda o ambiente do shell pai, mas depois disso, ele é um ser de vida distinto. Você não pode cd -mom no shell pai da sub-shell da mesma forma como você executa qualquer outro comando em um processo de outro processo. Em outras palavras, não há mágica como

command "run in process 123456"

Agora, embora você não possa enviar um comando para ser executado em um processo, você pode enviar um sinal para um processo com o comando kill . Portanto, se você preparar o shell pai anteriormente para essa situação, você pode trap desse sinal e executar algum comando.

Aqui está um exemplo mínimo:

/home/jimmij $ trap 'cd /tmp' INT
/home/jimmij $ cat myscript.sh
#!/bin/bash
echo Changing parent directory
kill -s SIGINT $PPID

/home/jimmij $ ./myscript.sh
Changing parent directory

/tmp $
    
por 07.01.2016 / 14:06