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)"