$ 0 সর্বদা স্ক্রিপ্টের পথ অন্তর্ভুক্ত করবে?


11

আমি বর্তমান স্ক্রিপ্টটি গ্রেপ করতে চাই যাতে শীর্ষে থাকা মন্তব্য বিভাগ থেকে সহায়তা এবং সংস্করণ তথ্য মুদ্রণ করতে পারি।

আমি এই জাতীয় কিছু সম্পর্কে ভাবছিলাম:

grep '^#h ' -- "$0" | sed -e 's/#h //'

তবে আমি ভাবলাম কী ঘটবে যদি স্ক্রিপ্টটি PATH- র একটি ডিরেক্টরিতে অবস্থিত থাকে এবং ডিরেক্টরিটি স্পষ্টভাবে উল্লেখ না করে কল করা হত।

আমি বিশেষ ভেরিয়েবলের ব্যাখ্যা অনুসন্ধান করেছি এবং এর নীচের বিবরণগুলি পেয়েছি $0:

  • বর্তমান শেল বা প্রোগ্রামের নাম

  • বর্তমান স্ক্রিপ্ট ফাইল নাম

  • লিপি নিজেই নাম

  • কমান্ড হিসাবে এটি চালানো হয়েছিল

এইগুলির কোনওটিই স্পষ্ট করে না $0যে স্ক্রিপ্টটি ছাড়া এটি চালিত হলে ডিরেক্টরিটির অন্তর্ভুক্ত হবে কি না । শেষটি আসলে আমার কাছে বোঝায় যে এটি হবে না।

আমার সিস্টেমে পরীক্ষা (4.1 বাশ)

আমি / usr / স্থানীয় / বিনে স্ক্রিপ্টনামটি এক লাইনের সাথে একটি এক্সিকিউটেবল ফাইল তৈরি করেছি echo $0এবং এটি বিভিন্ন অবস্থান থেকে অনুরোধ করেছি।

এগুলি আমার ফলাফল:

> cd /usr/local/bin/test
> ../scriptname
../scriptname

> cd /usr/local/bin
> ./scriptname
./scriptname

> cd /usr/local
> bin/scriptname
bin/scriptname

> cd /tmp
> /usr/local/bin/scriptname
/usr/local/bin/scriptname

> scriptname
/usr/local/bin/scriptname

এই পরীক্ষাগুলিতে, মানটি $0সর্বদা ঠিক কীভাবে স্ক্রিপ্টটি চালিত হয়েছিল তা বাদ দিয়ে যদি এটি কোনও পথের উপাদান ছাড়াই ডাকে। সেক্ষেত্রে এর মান $0হ'ল পরম পথ । সুতরাং দেখে মনে হচ্ছে এটি অন্য কমান্ডে পৌঁছে দেওয়া নিরাপদ।

কিন্তু তারপর আমি একটি মন্তব্যে জুড়ে এসেছিল স্ট্যাক ওভারফ্লো আমাকে বিভ্রান্ত। উত্তরটি $(dirname $0)বর্তমান স্ক্রিপ্টের ডিরেক্টরিটি পেতে ব্যবহার করার পরামর্শ দেয় । মন্তব্য (7 বার upvated) "" স্ক্রিপ্ট আপনার পথে থাকলে কাজ করবে না "বলে।

প্রশ্নাবলি

  • মন্তব্যটি কি সঠিক?
  • আচরণ কি অন্য সিস্টেমে আলাদা?
  • $0ডিরেক্টরি আছে না যেখানে পরিস্থিতি আছে ?

লোকেরা পরিস্থিতি সম্পর্কে উত্তর দিয়েছে যেখানে $0স্ক্রিপ্ট ব্যতীত অন্য কিছু রয়েছে যা প্রশ্নের শিরোনামের উত্তর দেয়। তবে, আমি $0স্ক্রিপ্ট নিজেই এমন পরিস্থিতিতে আগ্রহী , তবে ডিরেক্টরিটি অন্তর্ভুক্ত করে না। বিশেষত, আমি এসও উত্তরে মন্তব্যটি বোঝার চেষ্টা করছি।
টেক্সালট

উত্তর:


17

সর্বাধিক সাধারণ ক্ষেত্রে $0স্ক্রিপ্টের সাথে নিখুঁত বা আপেক্ষিক কোনও পথ থাকবে

script_path=$(readlink -e -- "$0")

(ধরে নিলাম একটি readlinkকমান্ড রয়েছে এবং এটি সমর্থন করে -e) সাধারণত স্ক্রিপ্টের আর্জনিক পরম পথটি পাওয়ার জন্য যথেষ্ট ভাল উপায়।

$0 দোভাষীকে দেওয়া হিসাবে স্ক্রিপ্ট নির্দিষ্ট করে যুক্তি থেকে নির্ধারিত হয়।

উদাহরণস্বরূপ, এতে:

the-shell -shell-options the/script its args

$0পায় the/script

আপনি যখন চালান:

the/script its args

আপনার শেলটি এটি করবে:

exec("the/script", ["the/script", "its", "args"])

যদি স্ক্রিপ্টে #! /bin/sh -উদাহরণস্বরূপ সে-ব্যাং থাকে তবে সিস্টেমটি এটিকে রূপান্তর করবে:

exec("/bin/sh", ["/bin/sh" or "the/script", "-", "the/script", "its", "args"])

(যদি এতে শিট-ব্যাং না থাকে বা আরও সাধারণভাবে যদি সিস্টেম কোনও ENOEXEC ত্রুটি ফিরিয়ে দেয় তবে তা আপনার শেলটি একই কাজ করবে)

কিছু সিস্টেমে সেটুইড / সেটগিড স্ক্রিপ্টগুলির ব্যতিক্রম রয়েছে, যেখানে সিস্টেমটি কিছুতে স্ক্রিপ্টটি খুলবে এবং তার fd xপরিবর্তে চালাবে:

exec("/bin/sh", ["/bin/sh" or "the/script", "-", "/dev/fd/x", "its", "args"])

জাতি শর্ত এড়ানোর জন্য (যার ক্ষেত্রে $0এটি অন্তর্ভুক্ত থাকবে /dev/fd/x)।

এখন, আপনি তর্ক করতে পারে যে /dev/fd/x হয় স্ক্রিপ্ট অবশ্যই এমন একটি পথ। তবে মনে রাখবেন যে আপনি যদি পড়ে থাকেন তবে আপনি $0ইনপুটটি গ্রাস করার সাথে সাথে স্ক্রিপ্টটি ভেঙে ফেলবেন।

এখন, একটি পার্থক্য আছে যদি স্ক্রিপ্ট কমান্ড নাম হিসাবে অনুরোধ করা স্ল্যাশ না থাকে। ভিতরে:

the-script its args

তোমার শেল আপ দেখবে the-scriptমধ্যে $PATH$PATHকিছু ডিরেক্টরিতে পরম বা আপেক্ষিক (খালি স্ট্রিং সহ) পাথ থাকতে পারে। উদাহরণস্বরূপ, যদি বর্তমান ডিরেক্টরীটিতে $PATHথাকে /bin:/usr/bin:এবং the-scriptএটি পাওয়া যায় তবে শেলটি এটি করবে:

exec("the-script", ["the-script", "its", "args"])

যা হয়ে যাবে:

exec("/bin/sh", ["/bin/sh" or "the-script", "-", "the-script", "its", "args"]

বা যদি এটিতে পাওয়া যায় /usr/bin:

exec("/usr/bin/the-script", ["the-script", "its", "args"])
exec("/bin/sh", ["/bin/sh" or "the-script" or "/usr/bin/the-script",
     "-", "/usr/bin/the-script", "its", "args")

উপরের সেতুগুলিতে সেটুইড কর্নার কেস বাদে $0স্ক্রিপ্টের জন্য একটি পথ (পরম বা আপেক্ষিক) থাকবে।

এখন, একটি স্ক্রিপ্ট এ হিসাবেও বলা যেতে পারে:

the-interpreter the-script its args

the-scriptউপরের হিসাবে যখন স্ল্যাশ অক্ষর নেই, আচরণটি শেল থেকে শেল থেকে কিছুটা পৃথক হয়।

পুরাতন এটিএন্ডটি kshবাস্তবায়নগুলি প্রকৃতপক্ষে নিঃশর্তভাবে স্ক্রিপ্টটি সন্ধান $PATHকরছিল (যা প্রকৃতপক্ষে একটি বাগ এবং সেটুইড স্ক্রিপ্টগুলির জন্য সুরক্ষা ছিদ্র ছিল) সুতরাং বর্তমান ডিরেক্টরিটিতে সন্ধানের সন্ধান না পাওয়া পর্যন্ত প্রকৃতপক্ষে স্ক্রিপ্টের কোনও পথ $0ছিল না$PATHthe-script

বর্তমানের ডিরেক্টরিতে এটি পাঠযোগ্য হয় তবে নতুন এটিএন্ডটি kshচেষ্টা করবে এবং ব্যাখ্যা the-scriptকরবে। যদি তা না হয় এটি একটি পাঠযোগ্য জন্য অনুসন্ধান করবে এবং এক্সিকিউটেবল the-script মধ্যে $PATH

কারণ bashএটি পরীক্ষা করে যে the-scriptএটি বর্তমান ডিরেক্টরিতে রয়েছে (এবং এটি কোনও ভাঙা সিমলিংক নয়) এবং যদি না হয় তবে এটিতে পাঠযোগ্য (প্রয়োজনীয়ভাবে নির্বাহযোগ্য নয়) the-scriptঅনুসন্ধান করা হবে $PATH

zshমধ্যে shএমুলেশন মত করবেন bashব্যতীত যে যদি the-scriptবর্তমান ডিরেক্টরির মধ্যে একটি ভাঙা সিমবলিক লিঙ্ক, এটা একটা অনুসন্ধান করবে না the-script$PATHএবং পরিবর্তে একটি ত্রুটি প্রতিবেদন হবে।

বোর্ন-এর মতো অন্যান্য শেলগুলি সন্ধান the-scriptকরে না $PATH

এই সমস্ত শেলের জন্য যাইহোক, যদি আপনি দেখতে পান যে এটিতে $0একটি নেই /এবং পাঠযোগ্য নয়, তবে সম্ভবত এটি সন্ধান করা হবে $PATH। তারপরে, ফাইলগুলি যেমন $PATHসম্পাদনযোগ্য হওয়ার সম্ভাবনা থাকে, সম্ভবত এটির নিরাপদ সন্ধানের জন্য command -v -- "$0"এটির সন্ধানের জন্য ব্যবহার করা (যদিও এটি $0শেল বিল্টিন বা কীওয়ার্ডের নাম (বেশিরভাগ শেলগুলিতে) হয়ে থাকে তবে এটি কাজ করবে না )।

সুতরাং আপনি যদি সত্যিই সেই কেসটি কভার করতে চান তবে আপনি এটি লিখতে পারেন:

progname=$0
[ -r "$progname" ] || progname=$(
    IFS=:; set -f
    for i in ${PATH-$(getconf PATH)}""; do
      case $i in
        "") p=$progname;;
        */) p=$i$progname;;
        *) p=$i/$progname
      esac
      [ -r "$p" ] && exec printf '%s\n' "$p"
    done
    exit 1
  ) && progname=$(readlink -e -- "$progname") ||
  progname=unknown

(এতে ""সংযুক্তি $PATHহ'ল শেলগুলির সাহায্যে একটি পেছনের ফাঁকা উপাদান সংরক্ষণ করা হবে যার বিভাজক পরিবর্তে ডিলিমিটার$IFS হিসাবে কাজ করে )।

এখন, আরও স্ক্রিপ্ট আহ্বান করার আরও রহস্যজনক উপায় রয়েছে। একজন করতে পারেন:

the-shell < the-script

বা:

cat the-script | the-shell

সেক্ষেত্রে, $0প্রথম আর্গুমেন্ট (হতে হবে argv[0]) যে ব্যাখ্যাকারী পেয়েছি (উপরে the-shell, কিন্তু যে কোন কিছুই হতে পারে যদিও সাধারণভাবে পারেন basename বা যে ব্যাখ্যাকারী এক পথ)।

মানটির ভিত্তিতে আপনি সেই পরিস্থিতিতে আছেন তা সনাক্ত করা $0নির্ভরযোগ্য নয়। আপনি ps -o args= -p "$$"একটি ক্লু পেতে আউটপুট তাকান পারে । পাইপের ক্ষেত্রে, আপনি স্ক্রিপ্টের পথে ফিরে যেতে কোনও আসল উপায় নেই।

এক এছাড়াও করতে পারে:

the-shell -c '. the-script' blah blih

তারপর, ছাড়া zsh(এবং বোর্ন শেলের কিছু পুরানো বাস্তবায়ন), $0হবে blah। আবার, সেই শেলগুলিতে স্ক্রিপ্টের পথে যাওয়া শক্ত hard

বা:

the-shell -c "$(cat the-script)" blah blih

প্রভৃতি

আপনার অধিকার রয়েছে তা নিশ্চিত করার জন্য $prognameআপনি এটিতে একটি নির্দিষ্ট স্ট্রিংয়ের জন্য অনুসন্ধান করতে পারেন:

progname=$0
[ -r "$progname" ] || progname=$(
    IFS=:; set -f
    for i in ${PATH-$(getconf PATH)}:; do
      case $i in
        "") p=$progname;;
        */) p=$i$progname;;
        *) p=$i/$progname
      esac
      [ -r "$p" ] && exec printf '%s\n' "$p"
    done
    exit 1
  ) && progname=$(readlink -e -- "$progname") ||
  progname=unknown

[ -f "$progname" ] && grep -q 7YQLVVD3UIUDTA32LSE8U9UOHH < "$progname" ||
  progname=unknown

তবে আবার আমি মনে করি না যে এটি প্রচেষ্টাটির পক্ষে মূল্যবান।


স্টাফেন, "-"উপরের উদাহরণগুলিতে আমি আপনার ব্যবহার বুঝতে পারি না । আমার অভিজ্ঞতায়, exec("the-script", ["the-script", "its", "args"])হয়ে যায় exec("/the/interpreter", ["/the/interpreter", "the-script", "its", "args"])অবশ্যই দোভাষীর বিকল্পের সম্ভাবনা।
jrw32982

@ jrw32982, #! /bin/sh -হয় "সবসময় ব্যবহার cmd -- somethingযদি আপনি নিশ্চয়তা দিতে পারে না somethingদিয়ে শুরু করা হবে না -" ভাল অভ্যাস প্রবচন এখানে প্রয়োগ /bin/sh(যেখানে -শেষ অফ বিকল্প মার্কার চেয়ে বেশি পোর্টেবল হিসাবে --) সঙ্গে somethingপথ / নাম হচ্ছে লিপি. আপনি যদি সেটুয়েড স্ক্রিপ্টগুলির জন্য এটি ব্যবহার না করেন (এমন সিস্টেমে যেগুলি তাদের সমর্থন করে তবে উত্তরটিতে উল্লিখিত / dev / fd / x পদ্ধতি ব্যবহার করে না) তবে আপনার স্ক্রিপ্টে ডায়াল করে একটি সিমলিংক তৈরি করে -iবা এর -sজন্য একটি রুট শেল পেতে পারেন দৃষ্টান্ত.
স্টাফেন চেজেলাস

ধন্যবাদ, স্টাফেন আমি আপনার উদাহরণ শেবাং লাইনের পিছনে থাকা একক হাইফেনটি মিস করেছি। আমি যেখানে এটি নথিভুক্ত করেছি সেখানে সন্ধান করতে হয়েছিল যে একটি একক হাইফেন একটি ডাবল হাইফেন পাবসের সমতুল্য op ওপেনগ্রুপ . org / অনলাইনপবস / 69 69৯৯৯৯ 7 /৯ / উপযোগীতা / এসএসএইচটিএমএল
jrw32982 মনিকা

সেটুয়েড স্ক্রিপ্টের জন্য শেবাং লাইনে চলমান একক / ডাবল হাইফেনটি ভুলে যাওয়া খুব সহজ; কোনওভাবে সিস্টেমটিকে আপনার যত্ন নেওয়া উচিত। সেটুইড স্ক্রিপ্টগুলি সম্পূর্ণরূপে প্রত্যাখ্যান করুন বা কোনওভাবে /bin/shতার নিজস্ব বিকল্প প্রক্রিয়াকরণটি অক্ষম করা উচিত যদি এটি সনাক্ত করতে পারে যে এটি সেটুইড চলছে running আমি দেখতে পাচ্ছি না কীভাবে / ডিভ / এফডি / এক্স ব্যবহার করে তা ঠিক করে দেয়। আমার এখনও মনে হয় আপনার একক / ডাবল হাইফেন দরকার।
jrw32982 মনিকা

@ jrw32982, /dev/fd/xদিয়ে শুরু হয় /, নয় -। প্রাথমিক লক্ষ্যটি হ'ল execve()যদিও উভয়ের মধ্যে রেসের শর্তটি সরিয়ে দেওয়া (এর মধ্যে execve("the-script")যা সুবিধাগুলি উন্নত করে এবং পরবর্তীকালে execve("interpreter", "thescript")যেখানে interpreterথিস্ক্রিপ্টটি পরে খোলে (যা খুব ভাল সময়েই অন্য কোনও কিছুর সাথে একটি সিমলিংক দ্বারা প্রতিস্থাপন করা যেতে পারে) সিস্টেমগুলি প্রয়োগ করে) SUID স্ক্রিপ্ট সঠিকভাবে একটি execve("interpreter", "/dev/fd/n")পরিবর্তে যেখানে n প্রথম execve (অংশ হিসেবে খোলা হয়েছে)।
Stéphane Chazelas

6

এখানে দুটি পরিস্থিতি রয়েছে যেখানে ডিরেক্টরিটি অন্তর্ভুক্ত করা হবে না :

> bash scriptname
scriptname

> bash <scriptname
bash

উভয় ক্ষেত্রেই, বর্তমান ডিরেক্টরিটি সেই ডিরেক্টরি হতে হবে যেখানে স্ক্রিপ্ট নামটি ছিল।

প্রথম ক্ষেত্রে, মানটি $0এখনও পাস হতে পারে grepযেহেতু এটি ধরে নেয় যে ফাইলের যুক্তিটি বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত।

দ্বিতীয় ক্ষেত্রে, যদি সহায়তা এবং সংস্করণ তথ্য কেবল একটি নির্দিষ্ট কমান্ড লাইন বিকল্পের প্রতিক্রিয়া হিসাবে মুদ্রিত হয়, এটি কোনও সমস্যা হওয়া উচিত নয়। আমি নিশ্চিত নই যে কেন কেউ সাহায্য বা সংস্করণ তথ্য মুদ্রণের জন্য কোনও স্ক্রিপ্ট অনুরোধ করবে।

আদেশ সহকারে

  • যদি স্ক্রিপ্টটি বর্তমান ডিরেক্টরি পরিবর্তন করে, আপনি আপেক্ষিক পাথ ব্যবহার করতে চাইবেন না।

  • স্ক্রিপ্টটি যদি সোর্স করা হয় তবে মানটি $0সাধারণত উত্সযুক্ত স্ক্রিপ্টের চেয়ে কলার স্ক্রিপ্ট হবে।


3

-cসর্বাধিক (সমস্ত?) শেলগুলির বিকল্প ব্যবহার করার সময় একটি নির্বিচারে আর্গুমেন্ট শূন্য নির্দিষ্ট করা যেতে পারে । উদাহরণ:

sh -c 'echo $0' argv0

থেকে man bash(নিখুঁতভাবে বেছে নেওয়া হয়েছে কারণ এটি আমার থেকে ভাল বর্ণনা রয়েছে man sh- নির্বিশেষে ব্যবহারের ব্যবহার একই রকম):

-c

যদি -c বিকল্পটি উপস্থিত থাকে, তবে কমান্ডগুলি প্রথম অ-বিকল্প আর্গুমেন্ট কমান্ড_স্ট্রিং থেকে পঠিত হবে। কমান্ড_স্ট্রিংয়ের পরে যদি আর্গুমেন্ট থাকে তবে তাদের অবস্থানিক পরামিতিগুলিতে বরাদ্দ করা হয়, $ 0 দিয়ে শুরু করে।


আমি মনে করি এটি কাজ করে কারণ -c 'কমান্ড' অপারেশনস, এবং argv0এটিই প্রথম নোঅপ্রেন্ড কমান্ডলাইন আর্গুমেন্ট।
মাইক্রজারভের

@ যেমন সঠিক, আমি একজন ব্যক্তির স্নিপেটের সাথে আপডেট করেছি।
গ্রামীণ

3

দ্রষ্টব্য: অন্যরা এর মেকানিক্স ইতিমধ্যে ব্যাখ্যা করেছে $0তাই আমি সমস্ত কিছু এড়িয়ে যাব।

আমি সাধারণতঃ সাইড পদক্ষেপ এই সমগ্র সমস্যা এবং কেবল কমান্ড ব্যবহার readlink -f $0। এটি সর্বদা আপনাকে যুক্তি হিসাবে যা দেবে তার পুরো পথটি আপনাকে ফিরিয়ে দেবে।

উদাহরণ

বলুন আমি এখানে দিয়ে শুরু করব:

$ pwd
/home/saml/tst/119929/adir

একটি ডিরেক্টরি + ফাইল করুন:

$ mkdir adir
$ touch afile
$ cd adir/

এখন দেখানো শুরু করুন readlink:

$ readlink -f ../adir
/home/saml/tst/119929/adir

$ readlink -f ../
/home/saml/tst/119929

$ readlink -f ../afile 
/home/saml/tst/119929/afile

$ readlink -f .
/home/saml/tst/119929/adir

অতিরিক্ত কৌশল

এখন একটি সামঞ্জস্যপূর্ণ ফলাফল নিয়ে ফিরে হচ্ছে যখন আমরা জিজ্ঞাসাবাদ $0মাধ্যমে readlinkআমরা একটি সহজভাবে ব্যবহার করতে পারেন dirname $(readlink -f $0)স্ক্রিপ্ট -অথবা- সঠিক পথটি পেতে basename $(readlink -f $0)স্ক্রিপ্ট প্রকৃত নাম জন্য।


0

আমার manপৃষ্ঠাটি বলেছেন:

$0: nameএর shellবা প্রসারিত হয় shell script

মনে হয় argv[0]এটি বর্তমান শেলের অনুবাদ করে - বা প্রথম ননোপ্রেন্ড কমান্ডলাইন আর্গুমেন্টটি যখন ডাকা হয় তখন তা ব্যাখ্যা করা শেলটি খাওয়ানো হয়। আমি আগেই বলেছি যে sh ./somescriptএর পরিবর্তনশীলটির দিকে যাত্রা করবে তবে এটি ভুল ছিল কারণ এটি নিজস্ব একটি নতুন প্রক্রিয়া এবং একটি নতুনের সাথে অনুরোধ করা হয়েছিল $0 $ENV shshell$ENV

এইভাবে বর্তমান পরিবেশে চলে এবং ইতিমধ্যে সেট করা আছে যা sh ./somescript.shথেকে পৃথক ।. ./somescript.sh$0

আপনি তুলনা করে এই পরীক্ষা করতে পারবেন $0করার /proc/$$/status

echo 'script="/proc/$$/status"
    echo $0
    cat "$script"' \
    > ./script.sh
sh ./script.sh ; . ./script.sh

সংশোধন করার জন্য ধন্যবাদ, @ টক্সালোট। আমি কিছু শিখেছি।


আমার সিস্টেমে যদি এটি সোর্স করা ( . ./myscript.shবা source ./myscript.sh) $0হয় তবে শেলটি। তবে যদি এটি শেল ( sh ./myscript.sh) এর আর্গুমেন্ট হিসাবে পাস $0হয় তবে স্ক্রিপ্টের পথ। অবশ্যই, shআমার সিস্টেমে বাশ। সুতরাং আমি জানি না যে এটি কোনও পার্থক্য করে কিনা।
টক্সালোট

এটিতে কি হ্যাশবাং আছে? আমি মনে করি যে পার্থক্যটি গুরুত্বপূর্ণ - এবং আমি এটি যুক্ত করতে পারি - এটি ছাড়া এটি হওয়া উচিত নয় execএবং পরিবর্তে এটি উত্স হওয়া উচিত , তবে এটির সাথে এটি হওয়া উচিত exec
মাইকজার্ভ

হ্যাশবাং সহ বা ছাড়া, আমি একই ফলাফল পেয়েছি। এক্সিকিউটেবল হওয়ার সাথে বা ছাড়াই, আমি একই ফলাফল পেয়েছি।
টক্সালোট

আমিও! আমি মনে করি এটি কারণ এটি একটি শেল বিল্টিন। আমি পরীক্ষা করছি ...
মাইক্রজারভ

ব্যাং লাইনগুলি কার্নেল দ্বারা ব্যাখ্যা করা হয়। আপনি যদি ./somescriptব্যাংলাইন দিয়ে সম্পাদন করেন তবে #!/bin/shএটি চলমান সমান /bin/sh ./somescript। অন্যথায় তারা শেলের সাথে কোনও পার্থক্য রাখে না।
গ্রামীণ

0

আমি বর্তমান স্ক্রিপ্টটি গ্রেপ করতে চাই যাতে শীর্ষে থাকা মন্তব্য বিভাগ থেকে সহায়তা এবং সংস্করণ তথ্য মুদ্রণ করতে পারি।

$0স্ক্রিপ্টের নাম অন্তর্ভুক্ত থাকাতে এটিতে স্ক্রিপ্টটি যেভাবে ডাকা হয় তার উপর ভিত্তি করে একটি উপসর্গযুক্ত পথ থাকতে পারে, আমি সর্বদা ${0##*/}সহায়তা আউটপুটে স্ক্রিপ্টের নামটি মুদ্রণ করতে ব্যবহার করেছি যা কোনও অগ্রণী পথ সরিয়ে দেয় $0

উন্নত বাশ স্ক্রিপ্টিং গাইড থেকে নেওয়া - বিভাগ 10.2 পরামিতি প্রতিস্থাপন

${var#Pattern}

থেকে সরান $varসবচেয়ে কম অংশ $Patternযে সামনে শেষ ম্যাচ $var

${var##Pattern}

থেকে সরান $varদীর্ঘতম অংশ $Patternযে সামনে শেষ ম্যাচ $var

সুতরাং সেই $0ম্যাচগুলির দীর্ঘতম অংশটি */পুরো স্ক্রিপ্টের নাম হবে, কেবল স্ক্রিপ্টের নাম ফেরত।


হ্যাঁ, সাহায্যের বার্তার মধ্যে ব্যবহৃত স্ক্রিপ্টটির নামের জন্য আমি এটিও করি । তবে আমি স্ক্রিপ্টটি গ্রেপিংয়ের কথা বলছি যাতে আমার কমপক্ষে একটি আপেক্ষিক পথ থাকা দরকার। আমি মন্তব্যগুলিতে সহায়তা বার্তাটি শীর্ষে রাখতে চাই এবং এটি মুদ্রণ করার পরে সহায়তা বার্তাটি পুনরায় পুনরায় পড়তে হবে না।
টক্সালোট

0

অনুরূপ কিছু জন্য আমি ব্যবহার:

rPath="$(dirname $(realpath $0))"
echo $rPath 

rPath=$(dirname $(readlink -e -- "$0"))
echo $rPath 

rPath সর্বদা একই মান হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.