Sorunuzun başlığının seçimi biraz kafa karıştırıcı.
pushd/ popd, ve cshtarafından kopyalanan bir özellik , hatırlanan dizin yığınını yönetmenin bir yoludur.bashzsh
pushd /some/dir
geçerli çalışma dizinini bir yığının üzerine iter ve sonra geçerli çalışma dizinini değiştirir (ve sonra yazdırır ve ardından /some/diro yığının içeriğini izler (boşlukla ayrılır).
popd
yığının içeriğini yazdırır (yine boşlukla ayrılır) ve ardından yığının üst öğesine değişir ve yığından çıkar.
(ayrıca bazı dizinlerin orada ~/xya da ~user/xgösterimleriyle temsil edileceğine dikkat edin ).
Yığında şu anda /ave varsa /b, geçerli dizin /hereve çalıştırıyorsanız:
pushd /tmp/whatever
popd
pushdyazdırılacak /tmp/whatever /here /a /bve popdçıktı /here /a /balınmayacak /tmp/whatever. Bu komut yerine koyma kullanmaktan bağımsızdır. popdönceki dizinin yolunu elde etmek için kullanılamaz ve genel olarak çıktısı sonradan işlenemez ( bu dizin yığının öğelerine erişmek için olsa da bazı kabukların dizisine $dirstackveya $DIRSTACKdizisine bakın )
Belki siz istersiniz:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Veya
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Yine de, ben:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
Her durumda, bir alt kabukta pushd "$(mktemp -d)"çalışmaz pushd. Eğer öyleyse, çalışma dizinini değiştiremedi. Bu mktempbir alt kabukta çalışır. Ayrı bir komut olduğundan, ayrı bir işlemde çalışması gerekir. Çıktısını bir boruya yazar ve kabuk işlemi bunu borunun diğer ucunda okur.
ksh93, komut yerleşik olduğunda ayrı işlemden kaçınabilir, ancak orada bile, bu süre normal olarak çatallamanın sağladığı ayrı ortama güvenmek yerine taklit edilen bir alt kabuk (farklı bir çalışma ortamı). Örneğin, ksh93, a=0; echo "$(a=1; echo test)"; echo "$a", hiçbir çatal hala katılan, ancak echo "$a"çıkışları 0.
Eğer çıktısını depolamak istiyorsanız Burada, mktempsen bunu geçerken aynı zamanda bir değişkende, pushdile, zshyapmanız olabilir:
pushd ${tmpdir::="$(mktemp -d)"}
Bourne benzeri diğer mermilerle:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Ya da çıktıyı $(mktemp -d)bir değişkende açıkça saklamaksızın birkaç kez kullanmak için zshanonim işlevleri kullanabilirsiniz :
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trapişleyici, işlem bir sinyalle delinirse dizini temizleyebilir.