आपके प्रश्न के शीर्षक का चुनाव थोड़ा भ्रमित करने वाला है।
pushd/ popd, cshद्वारा कॉपी की गई सुविधा bashऔर zsh, याद की गई निर्देशिकाओं के ढेर को प्रबंधित करने का एक तरीका है।
pushd /some/dir
एक स्टैक पर वर्तमान कार्यशील निर्देशिका को धकेलता है , और फिर वर्तमान कार्य निर्देशिका को बदलता है (और फिर /some/dirउस स्टैक की सामग्री के बाद प्रिंट करता है (स्थान-पृथक)।
popd
स्टैक की सामग्री को प्रिंट करता है (फिर से, अंतरिक्ष अलग हो जाता है) और फिर स्टैक के शीर्ष तत्व में बदल जाता है और इसे स्टैक से पॉप करता है।
(यह भी ध्यान रखें कि कुछ निर्देशिकाओं को उनके ~/xया ~user/xअंकन के साथ वहां प्रस्तुत किया जाएगा )।
तो अगर स्टैक वर्तमान में है /aऔर /b, वर्तमान निर्देशिका है /hereऔर आप चल रहे हैं:
pushd /tmp/whatever
popd
pushdप्रिंट करेगा /tmp/whatever /here /a /bऔर popdआउटपुट करेगा /here /a /b, नहीं /tmp/whatever। यह कमांड प्रतिस्थापन का उपयोग करने से स्वतंत्र है या नहीं। popdपिछले निर्देशिका के पथ प्राप्त करने के लिए इस्तेमाल नहीं किया जा सकता है, और सामान्य रूप में इसके उत्पादन के बाद संसाधित नहीं किया जा सकता है (देखें $dirstackया $DIRSTACKकुछ गोले की सरणी कि निर्देशिका ढेर के तत्वों तक पहुँचने के लिए, हालांकि)
शायद आप चाहते हैं:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
या
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
हालाँकि, मैं उपयोग करूँगा:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
किसी भी मामले में, एक उपधारा में pushd "$(mktemp -d)"नहीं चलता pushdहै। यदि यह किया जाता है, तो यह कार्यशील निर्देशिका को बदल नहीं सकता है। कि mktempएक उप में चलता है। चूंकि यह एक अलग कमांड है, इसलिए इसे एक अलग प्रक्रिया में चलना होगा। यह एक पाइप पर अपना आउटपुट लिखता है, और शेल प्रक्रिया पाइप के दूसरे छोर पर पढ़ती है।
ksh93 कमांड बनने पर अलग प्रक्रिया से बच सकता है, लेकिन वहां भी, यह अभी भी एक सबस्लेम (एक अलग काम करने का माहौल) है, जो इस समय को आमतौर पर फोर्किंग द्वारा प्रदान किए गए अलग-अलग वातावरण पर भरोसा करने के बजाय अनुकरण किया जाता है। उदाहरण के लिए, में ksh93, a=0; echo "$(a=1; echo test)"; echo "$a"कोई कांटा शामिल नहीं है, लेकिन फिर भी echo "$a"आउटपुट 0।
यहाँ, अगर आप के उत्पादन में संग्रहीत करना चाहते हैं mktempएक चर में, एक ही समय के रूप में आप इसे पारित पर pushd, साथ zsh, आप कर सकता है:
pushd ${tmpdir::="$(mktemp -d)"}
अन्य बॉर्न-जैसे गोले के साथ:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
या $(mktemp -d)इसे एक चर में स्पष्ट रूप से संग्रहीत किए बिना कई बार के आउटपुट का उपयोग करने के लिए , आप zshअनाम कार्यों का उपयोग कर सकते हैं :
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
trapहैंडलर निर्देशिका को साफ कर सकता है प्रक्रिया को एक सिग्नल द्वारा पोक्ड किया जाना चाहिए।