তবে শর্ত থাকে আপনি বর্তমান ডিরেক্টরির অনুমতি চালানো আছে - অথবা ডাইরেক্টরি যার থেকে আপনি আপনার শেল স্ক্রিপ্ট মৃত্যুদন্ড কার্যকর উপর - আপনি একটি ডিরেক্টরি আপনার প্রয়োজন হয় একটি সুনির্দিষ্ট পাথ চান cd।
দশকের দশম ধাপ cdspec
তাহলে -Pবিকল্প কার্যকরী হলে, $PWDএনভায়রনমেন্ট ভেরিয়েবল স্ট্রিং, যাতে দ্বারা আউটপুট হবে সেট হইবে pwd -P। যদি বর্তমান ডিরেক্টরিটি নির্ধারণ করতে নতুন ডিরেক্টরিতে বা সেই ডিরেক্টরিটির কোনও অভিভাবকের কাছে পর্যাপ্ত অনুমতি না থাকে তবে $PWDপরিবেশের ভেরিয়েবলের মান অনির্দিষ্ট।
এবং তারপরে pwd -P
স্ট্যান্ডার্ড আউটপুটে লিখিত পথের নামটিতে এমন কোনও উপাদান থাকবে না যা টাইপ প্রতীকী লিঙ্কের ফাইলগুলি উল্লেখ করে। যদি pwdইউটিলিটি স্ট্যান্ডার্ড আউটপুটে লিখতে পারে এমন একাধিক পাথের নাম রয়েছে , যেখানে একটি একক / স্ল্যাশ অক্ষর দিয়ে শুরু হয় এবং দুটি বা স্ল্যাশ অক্ষর দিয়ে এক বা একাধিক শুরু হয়, তবে এটি একক / স্ল্যাশ অক্ষর দিয়ে পথের নাম লিখতে হবে। পথের নামটিতে নেতৃস্থানীয় এক বা দুটি / স্ল্যাশ অক্ষরের পরে কোনও অপ্রয়োজনীয় / স্ল্যাশ অক্ষর থাকবে না।
এর কারণ cd -Pহ'ল বর্তমান কার্যনির্বাহী ডিরেক্টরিটি সেট করতে হবে যা pwd -Pঅন্যথায় প্রিন্ট করা উচিত এবং যা নিম্নলিখিত কাজ cd -করে $OLDPWDতা মুদ্রণ করতে হবে :
mkdir ./dir
ln -s ./dir ./ln
cd ./ln ; cd . ; cd -
আউটপুট
/home/mikeserv/test/ln
এটার জন্য অপেক্ষা কর...
cd -P . ; cd . ; cd -
আউটপুট
/home/mikeserv/test/dir
এবং যখন আমি মুদ্রণ cd -করছি সাথে মুদ্রণ $OLDPWD। যত তাড়াতাড়ি আমি এখন একটি নিখুঁত পথ হিসাবে cdসেট করে - তাই আমার অন্য কোনও ভেরিয়েবলের প্রয়োজন নেই don't এবং প্রকৃতপক্ষে, আমার এমনকি ট্রেলিংয়ের প্রয়োজন হবে না তবে অসাবধান অবস্থায় যখন একটি ইন্টারেক্টিভ শেলটিতে পুনরায় সেট করার নির্দিষ্ট আচরণ রয়েছে । সুতরাং এটি বিকাশ করার জন্য কেবল একটি ভাল অভ্যাস।$PWDcd -P . $PWD/.$PWD$HOMEcd
সুতরাং পথে উপরেরটি করা কেবলমাত্র তার পাথটি ${0%/*}যাচাই করার জন্য পর্যাপ্ত পরিমাণের বেশি হওয়া উচিত $0, তবে $0দুর্ভাগ্যক্রমে আপনি সম্ভবত এটির ডিরেক্টরি পরিবর্তন করতে পারবেন না।
এখানে একটি ফাংশন যা এটি পরিচালনা করবে:
zpath() { cd -P . || return
_out() { printf "%s$_zdlm\n" "$PWD/${1##*/}"; }
_cd() { cd -P "$1" ; } >/dev/null 2>&1
while [ $# -gt 0 ] && _cd .
do if _cd "$1"
then _out
elif ! [ -L "$1" ] && [ -e "$1" ]
then _cd "${1%/*}"; _out "$1"
elif [ -L "$1" ]
then ( while set -- "${1%?/}"; _cd "${1%/*}"; [ -L "${1##*/}" ]
do set " $1" "$(_cd -; ls -nd -- "$1"; echo /)"
set -- "${2#*"$1" -> }"
done; _out "$1"
); else ( PS4=ERR:\ NO_SUCH_PATH; set -x; : "$1" )
fi; _cd -; shift; done
unset -f _out _cd; unset -v _zdlm
}
এটি বর্তমান শেলটিতে যতটা সম্ভব চেষ্টা করার চেষ্টা করে - সাবসেল না করে - যদিও ত্রুটি এবং নরম লিঙ্কগুলির জন্য সাবস্কেলগুলি আহ্বান করা হয় যা ডিরেক্টরিগুলিকে নির্দেশ করে না। এটি একটি POSIX- সামঞ্জস্যপূর্ণ শেল এবং একটি POSIX- সামঞ্জস্যপূর্ণ lsপাশাপাশি একটি পরিষ্কার _function()নেমস্পেসের উপর নির্ভর করে । এটি পরেরটি ছাড়াই এখনও ঠিক সূক্ষ্মভাবে কাজ করবে, যদিও এটি ওভাররাইট হতে পারে তবে unsetসেই ক্ষেত্রে কিছু বর্তমান শেল ফাংশন। সাধারণভাবে এই সমস্ত নির্ভরতা কোনও ইউনিক্স মেশিনে নির্ভরযোগ্যভাবে উপলব্ধ হওয়া উচিত।
যুক্তিযুক্ত বা যুক্ত ছাড়া বলা হয় এটি প্রথমে $PWDতার সাধারণ মানটিতে পুনরায় সেট করা হয় - এটি সেখানে প্রয়োজনীয় যে কোনও লিঙ্ককে তাদের লক্ষ্যগুলিতে সমাধান করে। যুক্তি ছাড়াই কল করা এবং এটি সম্পর্কে; তবে তাদের সাথে আহ্বান জানানো হয়েছে এবং এটি প্রতিটিের জন্য পথটিকে সমাধান এবং ক্যানোনিকালাইজড করবে বা অন্যথায় stderrকেন একটি বার্তা প্রিন্ট করবে ।
কারণ এটি বেশিরভাগ বর্তমান শেলটিতে কাজ করে এটি কোনও দৈর্ঘ্যের একটি আর্গুমেন্ট তালিকা পরিচালনা করতে সক্ষম হওয়া উচিত। এটি $_zdlmভেরিয়েবলটিও সন্ধান করে (এটি unsetযখন এটি হয় তখন এটিও ঘটে) এবং এর সি-পালানো মানটি তত্ক্ষণাত্ তার প্রতিটি আর্গুমেন্টের ডানদিকে মুদ্রণ করে, যার প্রত্যেকটি সর্বদা একক \nইওলাইন অক্ষর দ্বারা অনুসরণ করা হয় ।
এটি অনেকগুলি ডিরেক্টরি পরিবর্তন করে, তবে এটির মূল নীতিতে সেট করা ব্যতীত, এটি প্রভাব ফেলবে না $PWD, যদিও $OLDPWDএটি কোনওভাবেই গণনা করা যায় না it
এটি এর প্রতিটি আর্গুমেন্ট যত তাড়াতাড়ি সম্ভব ত্যাগ করার চেষ্টা করে। এটি প্রথমে প্রবেশ করার চেষ্টা cdকরে $1। এটি যদি এটি করতে পারে তবে তর্কটির প্রমিত পথটি মুদ্রণ করে stdout। এটি যদি তা না পারে তবে এটি $1উপস্থিত রয়েছে এবং এটি কোনও নরম লিঙ্ক নয় soft সত্য হলে এটি মুদ্রণ করে।
এই পদ্ধতিতে এটি কোনও ফাইল টাইপের আর্গুমেন্ট পরিচালনা করে যা শেলকে অনুমতি দেওয়ার অনুমতি দেয় যদি না $1কোনও প্রতীকী লিঙ্ক থাকে যা কোনও ডিরেক্টরিতে নির্দেশ করে না। whileসেক্ষেত্রে এটি একটি সাব-শেলের মধ্যে লুপকে কল করে ।
এটি lsলিঙ্কটি পড়তে কল করে। কোনও ডিরেক্টরিকে নির্ভরযোগ্যতার সাথে পরিচালনা করতে বর্তমান ডিরেক্টরিটি প্রথমে তার প্রাথমিক মানতে অবশ্যই পরিবর্তন করা উচিত এবং তাই, কমান্ড সাবস্টিটিউশন সাবশেলের মাধ্যমে ফাংশনটি করে:
cd -...ls...echo /
lsলিঙ্কটির নাম এবং স্ট্রিংটি সম্পূর্ণরূপে অন্তর্ভুক্ত করতে এটির আউটপুট বাম থেকে সামান্য কম ->। আমি প্রথমে এটিটি এড়াতে চেষ্টা করেছি shiftএবং $IFSএটি প্রমাণিত হয়েছে যে এটি সবচেয়ে নির্ভরযোগ্য পদ্ধতিটি যতটা কাছাকাছি আমি চিত্রিত করতে পারি। গিলসের দরিদ্র_মানস_প্রেডলিঙ্কটি একই কাজ করে - এবং এটি খুব ভালভাবে সম্পন্ন হয়েছে।
ফাইল প্রক্রিয়াটি lsঅবশ্যই কোনও নরম লিঙ্ক না হওয়া পর্যন্ত এটি এই প্রক্রিয়াটিকে একটি লুপে পুনরাবৃত্তি করবে । এই মুহুর্তে এটি সেই প্রান্তটিকে পূর্বের মতো cdপ্রিন্টের সাথে পূর্বের মতো করে on
ব্যবহারের উদাহরণ:
zpath \
/tmp/script \ #symlink to $HOME/test/dir/script.sh
ln \ #symlink to ./dir/
ln/nl \ #symlink to ../..
/dev/fd/0 \ #currently a here-document like : dash <<\HD
/dev/fd/1 \ #(zlink) | dash
file \ #regular file
doesntexist \ #doesnt exist
/dev/disk/by-path/pci-0000:00:16.2-usb-0:3:1.0-scsi-0:0:0:0 \
/dev/./././././././null \
. ..
আউটপুট
/home/mikeserv/test/dir/script.sh
/home/mikeserv/test/dir/
/home/mikeserv/test/
/tmp/zshtpKRVx (deleted)
/proc/17420/fd/pipe:[1782312]
/home/mikeserv/test/file
ERR: NO_SUCH_PATH: doesntexist
/dev/sdd
/dev/null
/home/mikeserv/test/
/home/mikeserv/
বা সম্ভবত ...
ls
dir/ file file? folder/ link@ ln@ script* script3@ script4@
zdlm=\\0 zpath * | cat -A
আউটপুট
/home/mikeserv/test/dir/^@$
/home/mikeserv/test/file^@$
/home/mikeserv/test/file$
^@$
/home/mikeserv/test/folder/^@$
/home/mikeserv/test/file$ #'link' -> 'file\n'
^@$
/home/mikeserv/test/dir/^@$ #'ln' -> './dir'
/home/mikeserv/test/script^@$
/home/mikeserv/test/dir/script.sh^@$ #'script3' -> './dir/script.sh'
/home/mikeserv/test/dir/script.sh^@$ #'script4' -> '/tmp/script' -> ...