বাশ স্ক্রিপ্টে বর্তমান ডিরেক্টরি নাম (পুরো পাথ ছাড়াই) পান


816

বাশ স্ক্রিপ্টে আমি কীভাবে কেবল বর্তমান চলমান ডিরেক্টরি নামটি পেতে পারি, বা আরও ভাল, কেবলমাত্র একটি টার্মিনাল কমান্ড।

pwdবর্তমান কার্যনির্বাহী ডিরেক্টরিটির পুরো পথ দেয় যেমন, /opt/local/binতবে আমি কেবল চাইbin


উত্তর:


1112

বেসনামের প্রয়োজন নেই, এবং বিশেষত পিডাব্লুডিতে চলমান সাবসেলের প্রয়োজন নেই (যা একটি অতিরিক্ত, এবং ব্যয়বহুল, কাঁটাচামচ অপারেশন যুক্ত করে ); শেলটি প্যারামিটার সম্প্রসারণ ব্যবহার করে অভ্যন্তরীণভাবে এটি করতে পারে :

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 /

31
{{পিডব্লিউডি ## * /} এবং $ পিডাব্লুডির মধ্যে পার্থক্য কী?
মিঃ_চিম্প

24
@ এমআর_চিম্প পূর্বেরটি একটি প্যারামিটার এক্সপেনশন অপারেশন যা বাকী ডিরেক্টরিটি কেবলমাত্র বেসনাম সরবরাহ করতে ট্রিম করে। প্যারামিটার সম্প্রসারণ সম্পর্কিত ডকুমেন্টেশনের আমার উত্তরে আমার একটি লিঙ্ক আছে; আপনার যদি কোনও প্রশ্ন থাকে তবে তা নির্দ্বিধায় অনুভব করুন।
চার্লস ডাফি

24
@ স্টেফগোসেলিন $PWDহ'ল বিল্ট-ইন বাশ ভেরিয়েবলের নাম; সমস্ত বিল্ট-ইন ভেরিয়েবলের নামগুলি সমস্ত ক্যাপগুলিতে থাকে (তাদের স্থানীয় ভেরিয়েবলগুলি থেকে আলাদা করতে, যার সর্বদা কমপক্ষে একটি নিম্ন-অক্ষরের অক্ষর থাকা উচিত)। মূল্যায়ন result=${PWD#*/}করে না/full/path/to/directory ; পরিবর্তে, এটি তৈরি করে কেবল প্রথম উপাদানটি path/to/directory; দুটি #অক্ষর ব্যবহার করে প্যাটার্নটিকে লোভী করে তোলে, যত অক্ষরের সাথে এটি মিলছে। আরও তথ্যের জন্য উত্তরের সাথে যুক্ত প্যারামিটার সম্প্রসারণ পৃষ্ঠাটি পড়ুন।
চার্লস ডাফি 12

5
নোট করুন যে আউটপুটটি pwdসর্বদা মান হিসাবে সমান হয় না $PWD, cdপ্রতীকী লিঙ্কগুলির মাধ্যমে আইএনএস তৈরির ফলে সৃষ্ট জটিলতার কারণে , বাশের -o physicalবিকল্প সেট রয়েছে কিনা ইত্যাদি whether এটি বিশেষত স্বয়ংক্রিয়ভাবে পরিচালিত ডিরেক্টরিগুলি পরিচালনা করার আশেপাশে অভদ্রতা অর্জন করত, যেখানে লজিকালটির পরিবর্তে দৈহিক পথ রেকর্ডিংয়ের ফলে এমন একটি পথ তৈরি করা যেতে পারে যা যদি ব্যবহার করা হয়, তবে অটোমোন্টারটি যে ডিরেক্টরিটি ব্যবহার করছে তা স্বতঃস্ফূর্তভাবে ছাড়িয়ে দেবে।
অ্যালেক্স উত্তর-কীগুলি

3
নিস! আমার মতো পুরানো বর্ন শেল ছেলেদের জন্য কারও একটি বই লেখা উচিত। সম্ভবত সেখানে একটি আছে? এটিতে ক্রোটচিটির পুরানো সিস্টম অ্যাডমিনের মতো জিনিস থাকতে পারে, "আমার দিনে আমরা কেবলমাত্র shএবং cshআপনি যদি ব্যাকস্পেসের কাজটি করতে চান তবে আপনাকে পুরো sttyম্যান পৃষ্ঠাটি পড়তে হবে , এবং আমরা এটি পছন্দ করেছি!"
রেড ক্রিকেট

333

basenameপ্রোগ্রামটি ব্যবহার করুন । আপনার ক্ষেত্রে:

% basename "$PWD"
bin

19
এটি কি basenameপ্রোগ্রামটির উদ্দেশ্য নয় ? উক্তিটি বাদ দেওয়া ছাড়া এই উত্তরটিতে কী ভুল?
নচট - মনিকা পুনর্নির্মাণ

11
@Nacht basenameপ্রকৃতপক্ষে একটি বহিস্থিত প্রোগ্রাম যা ডান জিনিস আছে, কিন্তু চলমান কোন একটা জিনিস ব্যাশ জন্য বহিরাগত প্রোগ্রাম ব্যবহার শুধুমাত্র বিল্ট-ইন কার্যকারিতা নিরীহ হয় আউট-অফ-বাক্স করতে পারেন, কর্মক্ষমতা প্রভাব (incurring fork(), execve(), wait(), ইত্যাদি) জন্য কোন কারণ নেই.
চার্লস ডাফি

3
... আলাদা আলাদাভাবে, basenameএখানে আমার আপত্তিগুলি প্রযোজ্য নয়dirname , কারণ dirnameকার্যকারিতা রয়েছে যা ${PWD##*/}না - .উদাহরণস্বরূপ কোনও স্ল্যাশ ছাড়াই একটি স্ট্রিংকে রূপান্তর করা । সুতরাং, dirnameবাহ্যিক সরঞ্জাম হিসাবে ব্যবহার করার সময় ওভারহেডের পারফরম্যান্স থাকে তবে এর কার্যকারিতাও এটির জন্য ক্ষতিপূরণ করতে সহায়তা করে।
চার্লস ডাফি 12

4
@ লুইসম্যাডক্স, কিছুটা কিবিটজিং: মূলশব্দটি functionPOSIX- বেমানান নয় মানক সিনট্যাক্সের সাথে কোনও মান যুক্ত না করে এবং উদ্ধৃতিগুলির অভাব ফাঁকা স্থানের ডিরেক্টরিতে ডিরেক্টরি তৈরি করতে পারে। wdexec() { "./$(basename "$PWD")"; }একটি পছন্দসই বিকল্প হতে পারে।
চার্লস ডাফি

27
নিশ্চিতভাবে ব্যবহার basenameকরা কম "দক্ষ"। তবে এটি সম্ভবত বিকাশকারী উত্পাদনশীলতার দিক থেকে আরও দক্ষ কারণ কুশ্রী বাশ সিনট্যাক্সের তুলনায় এটি মনে রাখা সহজ। সুতরাং আপনি যদি এটি মনে রাখেন তবে এটির জন্য যান। অন্যথায়, basenameঠিক পাশাপাশি কাজ করে। কারও কি কখনও বাশ স্ক্রিপ্টের "পারফরম্যান্স" উন্নতি করতে এবং আরও দক্ষ করে তুলতে হয়েছে?
usr

139
$ echo "${PWD##*/}"

​​​​​


2
@ জোকাপ ... যুক্তিটি উদ্ধৃতি না দিয়ে সেখানে প্রতিধ্বনির ব্যবহার ভুল । যদি ডিরেক্টরি নামের একাধিক স্পেস বা একটি ট্যাব অক্ষর থাকে তবে এটি একটি একক স্পেসে পতিত হবে; যদি এর ওয়াইল্ডকার্ড অক্ষর থাকে তবে এটি প্রসারিত হবে। সঠিক ব্যবহার হবে echo "${PWD##*/}"
চার্লস ডাফি

9
@ জোকাপ ... এছাড়াও, আমি নিশ্চিত নই যে "প্রতিধ্বনি" আসলে উত্তরের একটি বৈধ অংশ। প্রশ্নটি ছিল উত্তরটি কীভাবে পাওয়া যায়, উত্তর কীভাবে প্রিন্ট করা যায় তা নয় ; উদাহরণস্বরূপ, যদি লক্ষ্যটি এটিকে একটি পরিবর্তনশীল হিসাবে নির্ধারণ করা হয় name=${PWD##*/}তবে এটি সঠিক name=$(echo "${PWD##*/}")হবে এবং ভুল হবে (অযথা-অদক্ষতার দিক থেকে)।
চার্লস ডাফি

24

আপনি পিডাব্লুডি এবং বেস নামের সংমিশ্রণটি ব্যবহার করতে পারেন। যেমন

#!/bin/bash

CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`

echo "$BASENAME"

exit;

18
অনুগ্রহ করে না. ব্যাকটিকগুলি একটি সাবশেল তৈরি করে (এইভাবে, একটি কাঁটাচামচ অপারেশন) - এবং এই ক্ষেত্রে আপনি এগুলি দুটিবার ব্যবহার করছেন ! [অতিরিক্ত হিসাবে স্টাইলিস্টিক কুইবল - পরিবর্তনশীল নামগুলি ছোট ক্ষেত্রে হওয়া উচিত যদি না আপনি সেগুলি পরিবেশে রফতানি করেন বা সেগুলি একটি বিশেষ, সংরক্ষিত কেস না হয়]
চার্লস ডাফি

11
এবং দ্বিতীয় শৈলীর হিসাবে কোয়েবল ব্যাকটিক্স $ () দ্বারা প্রতিস্থাপন করা উচিত। এখনও কাঁটাচামচ তবে আরও পঠনযোগ্য এবং কম খোলার প্রয়োজনীয়।
জেরেমি ওয়াল 21

1
কনভেনশন দ্বারা, পরিবেশের ভেরিয়েবল (PATH, EDITOR, শেল, ...) এবং অভ্যন্তরীণ শেল ভেরিয়েবলগুলি (BASH_VERSION, র্যান্ডোম, ...) সম্পূর্ণরূপে মূলধন হয়। অন্যান্য সমস্ত পরিবর্তনশীল নামগুলি ছোট হাতের অক্ষর হওয়া উচিত। যেহেতু পরিবর্তনশীল নামগুলি কেস-সংবেদনশীল, তাই এই সম্মেলনটি দুর্ঘটনাক্রমে পরিবেশগত এবং অভ্যন্তরীণ ভেরিয়েবলগুলিকে ওভাররাইড করা এড়িয়ে চলে।
রানি আলবেগ ওয়েইন

2
কনভেনশন উপর নির্ভর করে। যে কেউ তর্ক করতে পারে যে সমস্ত শেল ভেরিয়েবলগুলি পরিবেশের ভেরিয়েবল (শেলের উপর নির্ভর করে) এবং সুতরাং সমস্ত শেল ভেরিয়েবলগুলি সমস্ত ক্যাপগুলিতে থাকা উচিত। স্কোপের ভিত্তিতে অন্য কেউ তর্ক করতে পারে - গ্লোবাল ভেরিয়েবলগুলি সমস্ত ক্যাপ হয়, তবে স্থানীয় ভেরিয়েবলগুলি ছোট হাতের অক্ষর হয় এবং এগুলি সমস্ত গ্লোবাল। তবুও আরও একটি যুক্তি থাকতে পারে যে অল-আপারকেসেস ভেরিয়েবলগুলি তৈরি করা শিট স্ক্রিপ্ট লিটারিং কমান্ডের সাথে বিপরীতে একটি অতিরিক্ত স্তর যুক্ত করে, যা সমস্ত ছোট-ছোট সংক্ষিপ্ত হলেও অর্থপূর্ণ শব্দ words আমি এই যুক্তিগুলির কোনওটির সাথেই বা নাও / সম্মতি জানাতে পারি / করতে পারি, তবে আমি তিনটি ব্যবহারেই দেখেছি। :)
ড্যানিসাউয়ার

17

গ্রিপ সম্পর্কে কীভাবে:

pwd | grep -o '[^/]*$'

সুপারিশ করবে না কারণ এটি কিছু রঙিন তথ্য pwd | xargs basename
পেয়েছে

8

আমি নির্বাচিত উত্তরটি (চার্লস ডাফি) পছন্দ করি তবে আপনি যদি সিমলিংকড দিরে থাকেন এবং আপনি লক্ষ্য দিরের নামটি চান তবে সাবধান হন। দুর্ভাগ্যক্রমে আমি মনে করি না এটি একক প্যারামিটার সম্প্রসারণ অভিব্যক্তিতে করা সম্ভব, সম্ভবত আমার ভুল হয়েছে। এই কাজ করা উচিত:

target_PWD=$(readlink -f .)
echo ${target_PWD##*/}

এটি দেখতে, একটি পরীক্ষা:

cd foo
ln -s . bar
echo ${PWD##*/}

"বার" রিপোর্ট

DIRNAME

কোনও পথের শীর্ষস্থানীয় ডিরেক্টরিগুলি দেখানোর জন্য (/ usr / bin / dirname এর একটি কাঁটাচামচ না দিয়ে)

echo ${target_PWD%/*}

এটি যেমন ফু / বার / বাজ -> ফু / বার রূপান্তর করবে form


5
দুর্ভাগ্যক্রমে, readlink -fএকটি জিএনইউ এক্সটেনশন, এবং এটি বিএসডিগুলিতে (ওএস এক্স সহ) উপলভ্য নয়।
জিয়াং চিয়ামিভ

8
echo "$PWD" | sed 's!.*/!!'

আপনি যদি বোর্ন শেল ব্যবহার করছেন বা ${PWD##*/}উপলভ্য নয়।


4
এফওয়াইআই, ${PWD##*/}পসিক্স শ - প্রতিটি আধুনিক / বিন / শ (ড্যাশ, অ্যাশ ইত্যাদি সহ) এটি সমর্থন করে; সাম্প্রতিক বাক্সে আসল বোর্নকে আঘাত করতে আপনাকে একটি হালকা পুরানো সোলারিস সিস্টেমে থাকা দরকার। এর বাইরে - echo "$PWD"; উদ্ধৃতিগুলি বাদ দেওয়ার ফলে বাগগুলি বাড়ে (যদি ডিরেক্টরিটির নামের ফাঁকা স্থান থাকে, ওয়াইল্ডকার্ড অক্ষর ইত্যাদি থাকে)।
চার্লস ডাফি

1
হ্যাঁ, আমি একটি পুরানো সোলারিস সিস্টেম ব্যবহার করছিলাম। আমি উদ্ধৃতি ব্যবহার করার জন্য আদেশটি আপডেট করেছি।
অনাদিকাল

7

এই থ্রেড দুর্দান্ত! এখানে আরও একটি স্বাদ দেওয়া হল:

pwd | awk -F / '{print $NF}'

5

আশ্চর্যজনকভাবে, এই বিকল্পটি কেউ উল্লেখ করেনি যা কেবল বিল্ট-ইন বাশ কমান্ড ব্যবহার করে:

i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"

একটি অতিরিক্ত বোনাস হিসাবে আপনি সহজেই এর মাধ্যমে পিতামাতার ডিরেক্টরিটির নাম পেতে পারেন:

[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"

এগুলি বাশ 4.3-আলফা বা আরও নতুন ক্ষেত্রে কাজ করবে।


আশ্চর্যজনকভাবে? কেবল রসিকতা করা, তবে অন্যরা মনে রাখার চেয়ে আরও খাটো এবং সহজ
কোডওয়ান্ডার

এটি বেশ মজাদার = পি এর আগে $ আইএফএস (অভ্যন্তরীণ ক্ষেত্র বিভাজক) এর কথা শুনেনি। আমার বাশ খুব পুরানো ছিল, তবে এটি এখানে পরীক্ষা করতে পারে: jdoodle.com/test-bash-shell-script-online
স্টান

5

ব্যবহার করুন:

basename "$PWD"

অথবা

IFS=/ 
var=($PWD)
echo ${var[-1]} 

অভ্যন্তরীণ ফাইলের নাম পৃথককারী (আইএফএস) স্পেসে ফিরে যান।

IFS= 

আইএফএসের পরে একটি জায়গা রয়েছে।


4
basename $(pwd)

অথবা

echo "$(basename $(pwd))"

2
আরও কোটগুলি সঠিক হতে হবে - যেমনটি হয়, আউটপুটটি pwdস্ট্রিং-বিভক্ত হয়ে যাওয়ার আগে গ্লোব-প্রসারিত হয় basename
চার্লস ডাফি

সুতরাং, basename "$(pwd)"- যদিও এটি ন্যায়বিচারের তুলনায় খুব অদক্ষ basename "$PWD", যা মোটামুটি কল করার পরিবর্তে প্যারামিটার সম্প্রসারণের তুলনায় নিজেই অদক্ষ basename
চার্লস ডাফি

4

আমার মতো সেখানে জকি খুঁজে বার করুন:

find $PWD -maxdepth 0 -printf "%f\n"

অস্বাভাবিক ডিরেক্টরি নামগুলি সঠিকভাবে পরিচালনা $PWDকরতে এতে পরিবর্তন করুন "$PWD"
চার্লস ডাফি

3

আমি সাধারণত শ স্ক্রিপ্টগুলিতে এটি ব্যবহার করি

SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder

জিনিসগুলি স্বয়ংক্রিয় করতে আপনি এটি ব্যবহার করতে পারেন ...


readlink: illegal option -- f usage: readlink [-n] [file ...]


1

শুধু ব্যবহার করুন:

pwd | xargs basename

অথবা

basename "`pwd`"

2
এই সর্বথা উত্তর পূর্বে Arkady (কর্তৃক প্রদত্ত একটি খারাপ সংস্করণ stackoverflow.com/a/1371267/14122 ): xargsformultion অদক্ষ এবং ত্রুটি মুক্ত নয় যখন ডিরেক্টরির নাম আক্ষরিক নতুন লাইন বা উদ্ধৃতি অক্ষর থাকবে, এবং দ্বিতীয় সূত্র আহ্বান pwdকমান্ড বিল্ট-ইন ভেরিয়েবল প্রসারণের মাধ্যমে একই ফলাফলটি পুনরুদ্ধার করার পরিবর্তে একটি সাব-শেলের মধ্যে।
চার্লস ডাফি

@ চার্লসডাফি তা সত্ত্বেও এটি প্রশ্নের বৈধ এবং ব্যবহারিক উত্তর।
বাচ্ফ

1

আপনি যদি বাশ প্রম্পট অঞ্চলে কেবলমাত্র বর্তমান ডিরেক্টরিটি দেখতে চান তবে আপনি .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


0

আপনি বেসনেম ইউটিলিটিটি ব্যবহার করতে পারেন যা স্ট্রিং থেকে / এবং প্রত্যয় (যদি স্ট্রিংটিতে উপস্থিত থাকে) শেষ হওয়া কোনও উপসর্গ মুছে দেয় এবং ফলাফলটি স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করে।

$basename <path-of-directory>

0

আমি gbasenameদৃ strongly ়ভাবে ব্যবহার করতে পছন্দ করি , যা জিএনইউ কোর্টিলসের অংশ।


এফওয়াইআই, এটি আমার উবুন্টু বিতরণের সাথে আসে না।
ক্যাটাস্টিক ভয়েজ

@ ক্যাটাস্টিকভয়েজ, এটি উবুন্টুতে আছে, এটি কেবল basenameসেখানে ডাকা হয়েছে। এটি কেবলমাত্র gbasenameম্যাকওএস এবং অন্যান্য প্ল্যাটফর্মগুলিতে কল করা হয় যা অন্যথায় কোনও জিএনইউবিহীন বেস নাম সহ পাঠায়।
চার্লস ডাফি

-1

নিম্নলিখিত আদেশগুলি বাশ স্ক্রিপ্টে আপনার বর্তমান কাজ ডিরেক্টরি মুদ্রণের ফলাফল করবে in

pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR

2
(1) আমি নিশ্চিত নই যে আমরা কোথায় নিশ্চিত করছি যে আর্গুমেন্টের তালিকাটি $1বর্তমানে চলমান ডিরেক্টরি ডিরেক্টরি অন্তর্ভুক্ত করবে। (২) এখানে pushdএবং popdকোনও উদ্দেশ্যই পরিবেশন করা হয়নি কারণ ব্যাকটিক্সের অভ্যন্তরে যে কোনও কিছুই সাব-শেলের মধ্যে সম্পন্ন হয় - সুতরাং এটি প্যারেন্ট শেলের ডিরেক্টরিটি আরম্ভ করতে প্রভাবিত করতে পারে না। (3) "$(cd "$1"; pwd)"হোয়াইটস্পেস সহ ডিরেক্টরি নামের বিরুদ্ধে ব্যবহারযোগ্য হ'ল আরও পঠনযোগ্য এবং স্থিতিস্থাপক।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.