Sorunuzun başlığının seçimi biraz kafa karıştırıcı.
pushd
/ popd
, ve csh
tarafından kopyalanan bir özellik , hatırlanan dizin yığınını yönetmenin bir yoludur.bash
zsh
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/dir
o 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 ~/x
ya da ~user/x
gösterimleriyle temsil edileceğine dikkat edin ).
Yığında şu anda /a
ve varsa /b
, geçerli dizin /here
ve çalıştırıyorsanız:
pushd /tmp/whatever
popd
pushd
yazdırılacak /tmp/whatever /here /a /b
ve popd
çıktı /here /a /b
alı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 $dirstack
veya $DIRSTACK
dizisine 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 mktemp
bir 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, mktemp
sen bunu geçerken aynı zamanda bir değişkende, pushd
ile, zsh
yapmanı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 zsh
anonim işlevleri kullanabilirsiniz :
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trap
işleyici, işlem bir sinyalle delinirse dizini temizleyebilir.