आपके प्रश्न के शीर्षक का चुनाव थोड़ा भ्रमित करने वाला है।
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
हैंडलर निर्देशिका को साफ कर सकता है प्रक्रिया को एक सिग्नल द्वारा पोक्ड किया जाना चाहिए।