বাশ স্ক্রিপ্টে আমি কীভাবে কেবল বর্তমান চলমান ডিরেক্টরি নামটি পেতে পারি, বা আরও ভাল, কেবলমাত্র একটি টার্মিনাল কমান্ড।
pwdবর্তমান কার্যনির্বাহী ডিরেক্টরিটির পুরো পথ দেয় যেমন, /opt/local/binতবে আমি কেবল চাইbin
বাশ স্ক্রিপ্টে আমি কীভাবে কেবল বর্তমান চলমান ডিরেক্টরি নামটি পেতে পারি, বা আরও ভাল, কেবলমাত্র একটি টার্মিনাল কমান্ড।
pwdবর্তমান কার্যনির্বাহী ডিরেক্টরিটির পুরো পথ দেয় যেমন, /opt/local/binতবে আমি কেবল চাইbin
উত্তর:
বেসনামের প্রয়োজন নেই, এবং বিশেষত পিডাব্লুডিতে চলমান সাবসেলের প্রয়োজন নেই (যা একটি অতিরিক্ত, এবং ব্যয়বহুল, কাঁটাচামচ অপারেশন যুক্ত করে ); শেলটি প্যারামিটার সম্প্রসারণ ব্যবহার করে অভ্যন্তরীণভাবে এটি করতে পারে :
result=${PWD##*/} # to assign to a variable
printf '%s\n' "${PWD##*/}" # to print to stdout
# ...more robust than echo for unusual names
# (consider a directory named -e or -n)
printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input
# ...useful to make hidden characters readable.
মনে রাখবেন যে আপনি যদি অন্য পরিস্থিতিতে এই কৌশলটি প্রয়োগ করে থাকেন (তবে এটি নয় PWDতবে ডিরেক্টরিতে থাকা কিছু অন্যান্য ভেরিয়েবল), আপনার কোনও চলমান স্ল্যাশ ছাঁটাই করতে হতে পারে। নীচে একাধিক ট্রেলিং স্ল্যাশ সহ এমনকি কাজ করতে ব্যাশের এক্সটগ্লোব সমর্থন ব্যবহার করে :
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
বিকল্পভাবে, ছাড়া extglob:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
$PWDহ'ল বিল্ট-ইন বাশ ভেরিয়েবলের নাম; সমস্ত বিল্ট-ইন ভেরিয়েবলের নামগুলি সমস্ত ক্যাপগুলিতে থাকে (তাদের স্থানীয় ভেরিয়েবলগুলি থেকে আলাদা করতে, যার সর্বদা কমপক্ষে একটি নিম্ন-অক্ষরের অক্ষর থাকা উচিত)। মূল্যায়ন result=${PWD#*/}করে না/full/path/to/directory ; পরিবর্তে, এটি তৈরি করে কেবল প্রথম উপাদানটি path/to/directory; দুটি #অক্ষর ব্যবহার করে প্যাটার্নটিকে লোভী করে তোলে, যত অক্ষরের সাথে এটি মিলছে। আরও তথ্যের জন্য উত্তরের সাথে যুক্ত প্যারামিটার সম্প্রসারণ পৃষ্ঠাটি পড়ুন।
pwdসর্বদা মান হিসাবে সমান হয় না $PWD, cdপ্রতীকী লিঙ্কগুলির মাধ্যমে আইএনএস তৈরির ফলে সৃষ্ট জটিলতার কারণে , বাশের -o physicalবিকল্প সেট রয়েছে কিনা ইত্যাদি whether এটি বিশেষত স্বয়ংক্রিয়ভাবে পরিচালিত ডিরেক্টরিগুলি পরিচালনা করার আশেপাশে অভদ্রতা অর্জন করত, যেখানে লজিকালটির পরিবর্তে দৈহিক পথ রেকর্ডিংয়ের ফলে এমন একটি পথ তৈরি করা যেতে পারে যা যদি ব্যবহার করা হয়, তবে অটোমোন্টারটি যে ডিরেক্টরিটি ব্যবহার করছে তা স্বতঃস্ফূর্তভাবে ছাড়িয়ে দেবে।
shএবং cshআপনি যদি ব্যাকস্পেসের কাজটি করতে চান তবে আপনাকে পুরো sttyম্যান পৃষ্ঠাটি পড়তে হবে , এবং আমরা এটি পছন্দ করেছি!"
basenameপ্রোগ্রামটি ব্যবহার করুন । আপনার ক্ষেত্রে:
% basename "$PWD"
bin
basenameপ্রোগ্রামটির উদ্দেশ্য নয় ? উক্তিটি বাদ দেওয়া ছাড়া এই উত্তরটিতে কী ভুল?
basenameপ্রকৃতপক্ষে একটি বহিস্থিত প্রোগ্রাম যা ডান জিনিস আছে, কিন্তু চলমান কোন একটা জিনিস ব্যাশ জন্য বহিরাগত প্রোগ্রাম ব্যবহার শুধুমাত্র বিল্ট-ইন কার্যকারিতা নিরীহ হয় আউট-অফ-বাক্স করতে পারেন, কর্মক্ষমতা প্রভাব (incurring fork(), execve(), wait(), ইত্যাদি) জন্য কোন কারণ নেই.
basenameএখানে আমার আপত্তিগুলি প্রযোজ্য নয়dirname , কারণ dirnameকার্যকারিতা রয়েছে যা ${PWD##*/}না - .উদাহরণস্বরূপ কোনও স্ল্যাশ ছাড়াই একটি স্ট্রিংকে রূপান্তর করা । সুতরাং, dirnameবাহ্যিক সরঞ্জাম হিসাবে ব্যবহার করার সময় ওভারহেডের পারফরম্যান্স থাকে তবে এর কার্যকারিতাও এটির জন্য ক্ষতিপূরণ করতে সহায়তা করে।
functionPOSIX- বেমানান নয় মানক সিনট্যাক্সের সাথে কোনও মান যুক্ত না করে এবং উদ্ধৃতিগুলির অভাব ফাঁকা স্থানের ডিরেক্টরিতে ডিরেক্টরি তৈরি করতে পারে। wdexec() { "./$(basename "$PWD")"; }একটি পছন্দসই বিকল্প হতে পারে।
basenameকরা কম "দক্ষ"। তবে এটি সম্ভবত বিকাশকারী উত্পাদনশীলতার দিক থেকে আরও দক্ষ কারণ কুশ্রী বাশ সিনট্যাক্সের তুলনায় এটি মনে রাখা সহজ। সুতরাং আপনি যদি এটি মনে রাখেন তবে এটির জন্য যান। অন্যথায়, basenameঠিক পাশাপাশি কাজ করে। কারও কি কখনও বাশ স্ক্রিপ্টের "পারফরম্যান্স" উন্নতি করতে এবং আরও দক্ষ করে তুলতে হয়েছে?
$ echo "${PWD##*/}"
echo "${PWD##*/}"।
name=${PWD##*/}তবে এটি সঠিক name=$(echo "${PWD##*/}")হবে এবং ভুল হবে (অযথা-অদক্ষতার দিক থেকে)।
আপনি পিডাব্লুডি এবং বেস নামের সংমিশ্রণটি ব্যবহার করতে পারেন। যেমন
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
আমি নির্বাচিত উত্তরটি (চার্লস ডাফি) পছন্দ করি তবে আপনি যদি সিমলিংকড দিরে থাকেন এবং আপনি লক্ষ্য দিরের নামটি চান তবে সাবধান হন। দুর্ভাগ্যক্রমে আমি মনে করি না এটি একক প্যারামিটার সম্প্রসারণ অভিব্যক্তিতে করা সম্ভব, সম্ভবত আমার ভুল হয়েছে। এই কাজ করা উচিত:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
এটি দেখতে, একটি পরীক্ষা:
cd foo
ln -s . bar
echo ${PWD##*/}
"বার" রিপোর্ট
কোনও পথের শীর্ষস্থানীয় ডিরেক্টরিগুলি দেখানোর জন্য (/ usr / bin / dirname এর একটি কাঁটাচামচ না দিয়ে)
echo ${target_PWD%/*}
এটি যেমন ফু / বার / বাজ -> ফু / বার রূপান্তর করবে form
readlink -fএকটি জিএনইউ এক্সটেনশন, এবং এটি বিএসডিগুলিতে (ওএস এক্স সহ) উপলভ্য নয়।
echo "$PWD" | sed 's!.*/!!'
আপনি যদি বোর্ন শেল ব্যবহার করছেন বা ${PWD##*/}উপলভ্য নয়।
${PWD##*/}পসিক্স শ - প্রতিটি আধুনিক / বিন / শ (ড্যাশ, অ্যাশ ইত্যাদি সহ) এটি সমর্থন করে; সাম্প্রতিক বাক্সে আসল বোর্নকে আঘাত করতে আপনাকে একটি হালকা পুরানো সোলারিস সিস্টেমে থাকা দরকার। এর বাইরে - echo "$PWD"; উদ্ধৃতিগুলি বাদ দেওয়ার ফলে বাগগুলি বাড়ে (যদি ডিরেক্টরিটির নামের ফাঁকা স্থান থাকে, ওয়াইল্ডকার্ড অক্ষর ইত্যাদি থাকে)।
আশ্চর্যজনকভাবে, এই বিকল্পটি কেউ উল্লেখ করেনি যা কেবল বিল্ট-ইন বাশ কমান্ড ব্যবহার করে:
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
একটি অতিরিক্ত বোনাস হিসাবে আপনি সহজেই এর মাধ্যমে পিতামাতার ডিরেক্টরিটির নাম পেতে পারেন:
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
এগুলি বাশ 4.3-আলফা বা আরও নতুন ক্ষেত্রে কাজ করবে।
ব্যবহার করুন:
basename "$PWD"
অথবা
IFS=/
var=($PWD)
echo ${var[-1]}
অভ্যন্তরীণ ফাইলের নাম পৃথককারী (আইএফএস) স্পেসে ফিরে যান।
IFS=
আইএফএসের পরে একটি জায়গা রয়েছে।
basename $(pwd)
অথবা
echo "$(basename $(pwd))"
pwdস্ট্রিং-বিভক্ত হয়ে যাওয়ার আগে গ্লোব-প্রসারিত হয় basename।
basename "$(pwd)"- যদিও এটি ন্যায়বিচারের তুলনায় খুব অদক্ষ basename "$PWD", যা মোটামুটি কল করার পরিবর্তে প্যারামিটার সম্প্রসারণের তুলনায় নিজেই অদক্ষ basename।
আমার মতো সেখানে জকি খুঁজে বার করুন:
find $PWD -maxdepth 0 -printf "%f\n"
$PWDকরতে এতে পরিবর্তন করুন "$PWD"।
আমি সাধারণত শ স্ক্রিপ্টগুলিতে এটি ব্যবহার করি
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
জিনিসগুলি স্বয়ংক্রিয় করতে আপনি এটি ব্যবহার করতে পারেন ...
রেগেক্সের সাথে গ্রেপের নীচেও কাজ করছে,
>pwd | grep -o "\w*-*$"
শুধু ব্যবহার করুন:
pwd | xargs basename
অথবা
basename "`pwd`"
xargsformultion অদক্ষ এবং ত্রুটি মুক্ত নয় যখন ডিরেক্টরির নাম আক্ষরিক নতুন লাইন বা উদ্ধৃতি অক্ষর থাকবে, এবং দ্বিতীয় সূত্র আহ্বান pwdকমান্ড বিল্ট-ইন ভেরিয়েবল প্রসারণের মাধ্যমে একই ফলাফলটি পুনরুদ্ধার করার পরিবর্তে একটি সাব-শেলের মধ্যে।
আপনি যদি বাশ প্রম্পট অঞ্চলে কেবলমাত্র বর্তমান ডিরেক্টরিটি দেখতে চান তবে আপনি .bashrcফাইলটি সম্পাদনা করতে পারবেন ~। পরিবর্তন \wকরার জন্য \Wলাইনে:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
চালান source ~/.bashrc এবং এটি কেবল প্রম্পট অঞ্চলে ডিরেক্টরিটির নাম প্রদর্শন করবে।
রেফ: /superuser/60555/show-only-c टका-directory-name-not-full-path-on-bash-prompt
আমি gbasenameদৃ strongly ়ভাবে ব্যবহার করতে পছন্দ করি , যা জিএনইউ কোর্টিলসের অংশ।
basenameসেখানে ডাকা হয়েছে। এটি কেবলমাত্র gbasenameম্যাকওএস এবং অন্যান্য প্ল্যাটফর্মগুলিতে কল করা হয় যা অন্যথায় কোনও জিএনইউবিহীন বেস নাম সহ পাঠায়।
নিম্নলিখিত আদেশগুলি বাশ স্ক্রিপ্টে আপনার বর্তমান কাজ ডিরেক্টরি মুদ্রণের ফলাফল করবে in
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
$1বর্তমানে চলমান ডিরেক্টরি ডিরেক্টরি অন্তর্ভুক্ত করবে। (২) এখানে pushdএবং popdকোনও উদ্দেশ্যই পরিবেশন করা হয়নি কারণ ব্যাকটিক্সের অভ্যন্তরে যে কোনও কিছুই সাব-শেলের মধ্যে সম্পন্ন হয় - সুতরাং এটি প্যারেন্ট শেলের ডিরেক্টরিটি আরম্ভ করতে প্রভাবিত করতে পারে না। (3) "$(cd "$1"; pwd)"হোয়াইটস্পেস সহ ডিরেক্টরি নামের বিরুদ্ধে ব্যবহারযোগ্য হ'ল আরও পঠনযোগ্য এবং স্থিতিস্থাপক।