Alterar o diretório no script não altera o diretório - por quê?

Alterar o diretório no script não altera o diretório - por quê?

eu tenho vistoesta respostadesde que procurei por isso, mas inicialmente escrevi este script:

for i in `seq 1 $1`; 
   do cd ../;
done;

Não muda de diretório. Por que isso está funcionando como

./updir.sh 5

Responder1

A execução de um script conforme mostrado cria um ambiente copiado em um subshell, e quaisquer alterações feitas, como definir diretórios ou variáveis ​​de ambiente, afetam apenas esse ambiente de subshell, não o shell de chamada.

Para fazer alterações no shell atual a partir de um script, você deve executar o script dentro do shell atual usando o comando sourceou .:

. ./updir.sh 5

Você pode tornar isso automático com um alias:

alias updir='. ./updir.sh'

Alternativamente, você pode usar uma função em vez de um script:

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

Responder2

Porque os scripts são executados em um subshell, que controla o diretório de trabalho atual separadamente. A solução mais simples é usar uma função:

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

informação relacionada