A escolha do título da sua pergunta é um pouco confusa.
pushd
/ popd
, um csh
recurso copiado por bash
e zsh
, é uma maneira de gerenciar uma pilha de diretórios lembrados.
pushd /some/dir
empurra o actual directório de trabalho para uma pilha, e , em seguida, modifica a pasta de trabalho actual (e, em seguida, imprime /some/dir
seguido pelo teor de que a pilha (espaço-separadas).
popd
imprime o conteúdo da pilha (novamente, com espaço separado) e depois muda para o elemento superior da pilha e o remove da pilha.
(também tomar cuidado para que alguns diretórios será representado lá com sua ~/x
ou ~user/x
notação).
Portanto, se a pilha atualmente possui /a
e /b
, o diretório atual é /here
e você está executando:
pushd /tmp/whatever
popd
pushd
imprimirá /tmp/whatever /here /a /b
e popd
produzirá /here /a /b
, não /tmp/whatever
. Isso é independente do uso de substituição de comando ou não. popd
não pode ser usado para obter o caminho do diretório anterior e, em geral, sua saída não pode ser pós-processada (consulte a $dirstack
ou a $DIRSTACK
matriz de alguns shells para acessar os elementos dessa pilha de diretórios)
Talvez você queira:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Ou
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Porém, eu usaria:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
De qualquer forma, pushd "$(mktemp -d)"
não é executado pushd
em um subshell. Caso isso acontecesse, não poderia alterar o diretório de trabalho. Isso é mktemp
executado em um subshell. Por ser um comando separado, ele deve ser executado em um processo separado. Ele grava sua saída em um tubo, e o processo de shell a lê na outra extremidade do tubo.
O ksh93 pode evitar o processo separado quando o comando é incorporado, mas mesmo assim, ainda é um subshell (um ambiente de trabalho diferente) que desta vez é emulado, em vez de depender do ambiente separado normalmente fornecido pelo bifurcação. Por exemplo, em ksh93
, a=0; echo "$(a=1; echo test)"; echo "$a"
nenhum garfo está envolvido, mas ainda echo "$a"
gera saídas 0
.
Aqui, se você deseja armazenar a saída de mktemp
uma variável, ao mesmo tempo em que a passa para pushd
, com zsh
, você pode:
pushd ${tmpdir::="$(mktemp -d)"}
Com outras conchas do tipo Bourne:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Ou, para usar a saída $(mktemp -d)
várias vezes sem armazená-la explicitamente em uma variável, você pode usar zsh
funções anônimas:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
manipulador pode limpar o diretório, caso o processo seja cutucado por um sinal.