তবে শর্ত থাকে আপনি বর্তমান ডিরেক্টরির অনুমতি চালানো আছে - অথবা ডাইরেক্টরি যার থেকে আপনি আপনার শেল স্ক্রিপ্ট মৃত্যুদন্ড কার্যকর উপর - আপনি একটি ডিরেক্টরি আপনার প্রয়োজন হয় একটি সুনির্দিষ্ট পাথ চান cd
।
দশকের দশম ধাপ cd
spec
তাহলে -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 এবং প্রকৃতপক্ষে, আমার এমনকি ট্রেলিংয়ের প্রয়োজন হবে না তবে অসাবধান অবস্থায় যখন একটি ইন্টারেক্টিভ শেলটিতে পুনরায় সেট করার নির্দিষ্ট আচরণ রয়েছে । সুতরাং এটি বিকাশ করার জন্য কেবল একটি ভাল অভ্যাস।$PWD
cd -P .
$PWD
/
.
$PWD
$HOME
cd
সুতরাং পথে উপরেরটি করা কেবলমাত্র তার পাথটি ${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' -> ...