Pilihan judul pertanyaan Anda agak membingungkan.
pushd/ popd, cshfitur yang disalin oleh bashdan zsh, adalah cara untuk mengelola tumpukan direktori yang diingat.
pushd /some/dir
mendorong direktori kerja saat ini ke tumpukan, dan kemudian mengubah direktori kerja saat ini (dan kemudian mencetak /some/dirdiikuti oleh konten tumpukan itu (dipisahkan ruang).
popd
mencetak isi tumpukan (sekali lagi, dipisahkan dengan ruang) dan kemudian berubah ke elemen atas tumpukan dan mengeluarkannya dari tumpukan.
(juga berhati-hatilah bahwa beberapa direktori akan diwakili sana dengan mereka ~/xatau ~user/xnotasi).
Jadi jika tumpukan saat ini memiliki /adan /b, direktori saat ini adalah /heredan Anda sedang menjalankan:
pushd /tmp/whatever
popd
pushdakan mencetak /tmp/whatever /here /a /bdan popdakan menampilkan /here /a /b, bukan /tmp/whatever. Itu independen menggunakan substitusi perintah atau tidak. popdtidak dapat digunakan untuk mendapatkan path dari direktori sebelumnya, dan secara umum outputnya tidak dapat diproses pasca (lihat array $dirstackatau $DIRSTACKbeberapa shell meskipun untuk mengakses elemen-elemen dari stack direktori)
Mungkin Anda ingin:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Atau
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Padahal, saya akan menggunakan:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
Bagaimanapun, pushd "$(mktemp -d)"tidak berjalan pushddalam subkulit. Jika ya, itu tidak bisa mengubah direktori kerja. Itu mktempyang berjalan dalam subkulit. Karena itu adalah perintah yang terpisah, itu harus dijalankan dalam proses yang terpisah. Itu menulis outputnya pada pipa, dan proses shell membacanya di ujung pipa yang lain.
ksh93 dapat menghindari proses terpisah ketika perintah dibangun di dalam, tetapi bahkan di sana, itu masih sebuah subkulit (lingkungan kerja yang berbeda) yang kali ini ditiru daripada mengandalkan pada lingkungan terpisah yang biasanya disediakan oleh forking. Misalnya, dalam ksh93,, a=0; echo "$(a=1; echo test)"; echo "$a"tidak ada percabangan yang terlibat, tetapi masih echo "$a"menghasilkan 0.
Di sini, jika Anda ingin menyimpan output mktempdalam variabel, pada saat yang sama ketika Anda meneruskannya ke pushd, dengan zsh, Anda bisa melakukan:
pushd ${tmpdir::="$(mktemp -d)"}
Dengan kerang mirip Bourne lainnya:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Atau untuk menggunakan output $(mktemp -d)beberapa kali tanpa secara eksplisit menyimpannya dalam variabel, Anda bisa menggunakan zshfungsi anonim:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trappawang dapat membersihkan direktori jika prosesnya ditusuk oleh sinyal.