Quando eu mudo o diretório de trabalho em um script e o executo, o diretório de trabalho só muda para o caminho especificado enquanto estiver no script

Quando eu mudo o diretório de trabalho em um script e o executo, o diretório de trabalho só muda para o caminho especificado enquanto estiver no script

Quando altero o diretório de trabalho em um script e o executo, o diretório de trabalho só muda para o caminho especificado enquanto estiver no script. Aqui está o meu script: (isso foi para ter certeza se ele realmente mudou de diretório)
#!/bin/bash
cd /media/hard/drive/partitionX/
pwd

Quando eu o executo, ele retorna o caminho especificado, mas meu diretório de trabalho no terminal não muda. Como altero o diretório de trabalho no meu terminal através de um script?

Responder1

Isto é normal. O diretório "atual" ou "de trabalho" é um parâmetro por processo e um processo só pode mudarprópriodiretório de trabalho. Scripts independentes são executados como um processo de shell separado e não podem afetar o shell pai (na verdade, o pai pode nem sempresercomo o inferno).

Você precisará usar recursos internos ao seu shell, como:

  • funções de shell:

    mycd() {
        cd /media/hard/drive/partitionX/;
        pwd;
    }
    
  • apelidos de shell:

    alias mycd='cd /media/hard/drive/partitionX; pwd'
    
  • "source" um script em vez de executá-lo:

    . mycd.sh
    

Se o seu objetivo principal é criar atalhos para determinados diretórios, você também pode usar:

  • links simbólicos em um local mais conveniente:

    ln -s /media/hard/drive/partitionX ~/partX
    cd ~/partX
    
  • variáveis ​​($meudir):

    mydir=/media/hard/drive
    cd $mydir
    
  • o recurso $CDPATH:

    CDPATH=".:/media/hard/drive"
    cd partitionX
    

Responder2

Na verdade, acabei de descobrir, depois de muitas pesquisas, que se você precisar alterar o diretório, e ainda manter o mesmo shell, para obter todas as respostas no seu script atual, você pode usar:

(cd your_dir; do_some_command_there)

Por exemplo, o que eu precisava usar era:

((cd your_dir; git remote -v | wc -l)

Funciona como um encanto!

informação relacionada