A escolha do título da sua pergunta é um pouco confusa.
pushd / popd , um recurso csh copiado por bash e zsh , são uma maneira de gerenciar uma pilha de diretórios lembrados.
pushd /some/dir
empurra o diretório de trabalho atual para uma pilha, e então altera o diretório de trabalho atual (e então imprime /some/dir seguido pelo conteúdo dessa pilha separados).
popd
imprime o conteúdo da pilha (novamente, separado por espaço) e, em seguida, muda para o elemento superior da pilha e a salta da pilha.
(também cuidado com o fato de que alguns diretórios serão representados lá com sua ~/x ou ~user/x notação).
Portanto, se a pilha tiver atualmente /a e /b , o diretório atual será /here e você estará 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 comandos 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 processada (consulte o array $dirstack or $DIRSTACK de alguns shells para acessar os elementos dessa pilha de diretório)
Talvez você queira:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Ou
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
No entanto, eu usaria:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
Em qualquer caso, pushd "$(mktemp -d)" não executa pushd em um subshell. Se assim fosse, não poderia alterar o diretório de trabalho. Isso é mktemp que é executado em um subshell. Como é um comando separado, ele precisa ser executado em um processo separado. Ele grava sua saída em um pipe e o processo do shell o lê na outra extremidade do pipe.
O ksh93 pode evitar o processo separado quando o comando está embutido, mas mesmo assim, ele ainda é um subshell (um ambiente de trabalho diferente) que desta vez é emulado, em vez de depender do ambiente normalmente fornecido pelo bifurcação. Por exemplo, em ksh93 , a=0; echo "$(a=1; echo test)"; echo "$a" , nenhum fork está envolvido, mas ainda echo "$a" outputs 0 .
Aqui, se você quiser armazenar a saída de mktemp em uma variável, ao mesmo tempo em que a passar para pushd , com zsh , poderá fazer:
pushd ${tmpdir::="$(mktemp -d)"}
Com outras shells parecidas com Bourne:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Ou para usar a saída de $(mktemp -d) várias vezes sem armazená-lo explicitamente em uma variável, você poderia usar zsh funções anônimas:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"