O uso do diretório em scripts é questionável porque é propenso a riscos. popd
não retorna ao diretório original, ele retorna ao diretório com o mesmo nome. Se o diretório original foi movido, o seu script irá mudar de localização no meio do caminho. Isso pode parecer um risco remoto, mas mais cedo ou mais tarde isso acontecerá e os usuários do script irão xingar você.
Se você quiser agir temporariamente em um diretório diferente, a melhor maneira é executar essa parte do script em um subshell.
( set -e
cd "${TMPDIR:-/tmp}"
wget -q http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
sudo make install
)
Apenas para o exemplo, mostrarei abordagens alternativas que não são necessárias aqui, mas que podem ser úteis em situações semelhantes em que uma subcamada não é adequada, por ex. porque você deseja definir algumas variáveis e disponibilizá-las depois de retornar ao diretório original.
Você pode não precisar mudar para um diretório diferente ou apenas para a duração de um comando individual. Se você estiver usando ferramentas GNU, tanto tar
como make
suportam um argumento -C
para alternar para um diretório. Como você está criando esse diretório em seu script, ao contrário do diretório original, é razoável supor que o local não será movido.
set -e
: "${TMPDIR:=/tmp}"
wget -q -O "$TMPDIR/redis-stable.tar.gz" http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz -C "$TMPDIR"
make -C "$TMPDIR/redis-stable"
sudo make -C "$TMPDIR/redis-stable" install
Com comandos que não têm a opção de mudar para um diretório diferente, você pode usar um subshell com um escopo limitado.
set -e
: "${TMPDIR:=/tmp}"
( cd "$TMPDIR"
wget -q http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz -C "$TMPDIR"
)
( cd "$TMPDIR/redis-stable"
make
sudo make install
)
Se você realmente precisa alternar, a melhoria óbvia para várias chamadas para popd
é chamar cd
quando você quer dizer cd
, em vez de chamar pushd
para um diretório que você não deseja para retornar a.
set -e
pushd "${TMPDIR:-/tmp}"
wget -q http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
sudo make install
popd
Mas eu realmente recomendo não usar pushd
e popd
. Eles são feitos para uso interativo, e em scripts eles tendem a ser mais confusos do que qualquer coisa. Se você deseja salvar o local do diretório atual, salve-o em uma variável. Isso facilita a leitura do seu script, assim o leitor não precisa descobrir onde a chamada popd
retornará.
set -e
original_directory="$PWD"
cd "${TMPDIR:-/tmp}"
wget -q http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
sudo make install
cd "$original_directory"