আপনার প্রশ্নের শিরোনামের পছন্দটি কিছুটা বিভ্রান্তিকর।
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
একটি সাব-শেলের মধ্যে চলে। যেহেতু এটি একটি পৃথক কমান্ড, তাই এটি একটি পৃথক প্রক্রিয়াতে চালিত হতে হবে। এটি একটি পাইপে তার আউটপুট লিখেছে, এবং শেল প্রক্রিয়াটি পাইপের অন্য প্রান্তে পড়ে reads
কমান্ডটি অন্তর্নির্মিত হওয়ার সাথে সাথে 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
হ্যান্ডলার ডিরেক্টরিটি ক্লিনআপ করতে পারে যদি কোনও সিগন্যাল দ্বারা প্রক্রিয়াটি পোজ করা উচিত।