এর উদ্দেশ্য কী: (কোলন) জিএনইউ বাশ অন্তর্নির্মিত?


335

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

আপনার স্ক্রিপ্টগুলিতে কল প্রতি 40% দ্বারা একটি মন্তব্য প্রবেশের চেয়ে ধীরে ধীরে ধীরে ধীরে কমেন্টের আকারের উপর নির্ভর করে যা পরিবর্তিত হয়। আমি এর জন্য কেবলমাত্র সম্ভাব্য কারণগুলি দেখতে পাচ্ছি সেগুলি হ'ল:

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true' (lazy programming)
while : ; do command ; done

আমি অনুমান করি যে আমি সত্যিই যা খুঁজছি তা হ'ল এটির historicalতিহাসিক প্রয়োগটি।



69
@ কালেব - আমি এটির দুটি বছর আগে এটি জিজ্ঞাসা করেছি।
অ্যাম্ফেটামাইচাইন

আমি কোনও কমান্ড বলব না যা একটি নির্দিষ্ট মান প্রদান করে "কিছুই করে না"। যদি না কার্যক্ষম প্রোগ্রামিং "কিছুই না করে" নিয়ে থাকে। :-)
লার্শ

উত্তর:


415

ঐতিহাসিকভাবে , বোর্ন শাঁস ছিল না trueএবং falseযেমন বিল্ট-ইন কমান্ড। trueপরিবর্তে কেবল ওরফে হয়েছিল :, এবং falseভালো কিছু করার জন্য let 0

:trueপ্রাচীন বোর্ন-উত্পন্ন শেলগুলির বহনযোগ্যতার তুলনায় কিছুটা ভাল । একটি সাধারণ উদাহরণ হিসাবে, !পাইপলাইন অপারেটর বা ||তালিকার অপারেটর না হওয়ার বিষয়টি বিবেচনা করুন (যেমন কিছু প্রাচীন বোর্ন শেলগুলির ক্ষেত্রে ছিল)। এটি প্রস্থান স্থিতির উপর ভিত্তি করে শাখার একমাত্র মাধ্যম হিসাবে বিবৃতিটির elseধারাটিকে ছেড়ে দেয় if:

if command; then :; else ...; fi

যেহেতু ifএকটি খালি thenশৃঙ্খলা আবশ্যক এবং মন্তব্যগুলি খালি শূন্য হিসাবে গণনা করা হয় না, তাই :কোনও অপ-অফ হিসাবে কাজ করে।

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

  • শেলটিতে বিশেষ বিল্ট-ইনগুলি তৈরি করা প্রয়োজন; নিয়মিত বিল্ট-ইনগুলি কেবল "সাধারণত" অন্তর্নির্মিত থাকে তবে এটির কঠোর গ্যারান্টি নেই। বেশিরভাগ সিস্টেমে PATH এর :কার্যকারিতা সহ একটি নিয়মিত প্রোগ্রাম হওয়া উচিত নয় true

  • সম্ভবত সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি হ'ল বিশেষ বিল্ট-ইনগুলির সাথে, বিল্ট-ইন দ্বারা নির্ধারিত কোনও পরিবর্তনশীল - এমনকি সাধারণ কমান্ড মূল্যায়নের সময় পরিবেশে - কমান্ডটি সম্পূর্ণ হওয়ার পরেও স্থির থাকে, যেমন এখানে ksh93 ব্যবহার করে প্রদর্শিত হয়েছে:

    $ unset x; ( x=hi :; echo "$x" )
    hi
    $ ( x=hi true; echo "$x" )
    
    $

    নোট করুন যে জেএসএস এই প্রয়োজনীয়তাটিকে উপেক্ষা করে, জিএনইউ বাশ যেমন পসিক্স সামঞ্জস্যতা মোডে পরিচালনা করার সময় বাদ দেয়, তবে অন্যান্য সমস্ত বড় "পসিক্স ডেরাইভড" শেল এটি ড্যাশ, কেএস ৯৩, এবং ম্যাক্স সহ পর্যবেক্ষণ করে।

  • আর একটি পার্থক্য হ'ল নিয়মিত বিল্ট-ইনগুলি অবশ্যই সামঞ্জস্যপূর্ণ exec- বাশ ব্যবহার করে এখানে প্রদর্শিত হবে:

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
  • পসিক্সও স্পষ্টভাবে নোট করে যা এর :চেয়ে দ্রুততর হতে পারে trueযদিও এটি অবশ্যই একটি বাস্তবায়ন-নির্দিষ্ট বিশদ।


আপনি কি বোঝাতে চেয়েছিলেন যে নিয়মিত বিল্ট-ইনগুলি অবশ্যই সামঞ্জস্যপূর্ণ নয়exec ?
ওল্ড প্রো

1
@OldPro: না, তিনি সঠিক যে trueএকটি নিয়মিত builtin, কিন্তু তিনি যে ভুল execব্যবহার করছে /bin/truebuiltin পরিবর্তে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
পুনঃটুইট করেছেন এর অর্থ অবশ্যই নিহিত যে নিয়মিত বিল্টিনগুলিতেও স্ট্যান্ড্যালোন সংস্করণ থাকা উচিত।
ormaaj

17
+1 দুর্দান্ত উত্তর। আমি এখনও : ${var?not initialized}এট আল এর মত চলক আরম্ভ করার জন্য ব্যবহারটি নোট করতে চাই ।
ট্রিপলি

আরও কম-বেশি সম্পর্কযুক্ত ফলো-আপ। আপনি বলেছিলেন :একটি বিশেষ অন্তর্নির্মিত এবং এর নামে কোনও ফাংশন থাকা উচিত নয়। তবে কাঁটা বোমার :(){ :|: & };:নামকরণ সহ কোনও ফাংশন নামকরণের সর্বাধিক দেখা যায় না :?
চং

63

আমি সহজেই ভেরিয়েবল কমান্ড সক্ষম / অক্ষম করতে এটি ব্যবহার করি:

#!/bin/bash
if [[ "$VERBOSE" == "" || "$VERBOSE" == "0" ]]; then
    vecho=":"     # no "verbose echo"
else
    vecho=echo    # enable "verbose echo"
fi

$vecho "Verbose echo is ON"

এইভাবে

$ ./vecho
$ VERBOSE=1 ./vecho
Verbose echo is ON

এটি একটি পরিষ্কার স্ক্রিপ্ট তৈরি করে। এটি '#' দিয়ে করা যাবে না।

এছাড়াও,

: >afile

'আফাইল' বিদ্যমান তবে 0 দৈর্ঘ্যের গ্যারান্টি দেওয়ার একটি সহজ উপায়।


20
>afileএমনকি সহজ এবং একই প্রভাব অর্জন।
আর্ল

2
দুর্দান্ত, আমি যে স্ক্রিপ্টগুলি রক্ষণ করছি তার সরলকরণের জন্য আমি সেই ভেকো ট্রিকটি ব্যবহার করব।
বার্নিশ্মলে 20

5
কোলনে উদ্ধৃতি দিয়ে কী লাভ vecho=":"? কেবল পাঠযোগ্যতার জন্য?
লিওজ

56

এর জন্য একটি দরকারী অ্যাপ্লিকেশন: হ'ল যদি আপনি কেবলমাত্র তাদের ফলাফলকে কমান্ডে না দিয়ে পার্শ্ব-প্রতিক্রিয়াগুলির জন্য প্যারামিটার বিস্তৃতি ব্যবহার করতে আগ্রহী হন। সেক্ষেত্রে আপনি পিইটিকে যুক্তি হিসাবে ব্যবহার করেন: অথবা আপনি 0 বা 1 এর প্রস্থান স্থিতি চান কিনা তার উপর নির্ভর করে মিথ্যা An উদাহরণ হতে পারে : "${var:=$1}"। যেহেতু :একটি অন্তর্নির্মিত এটি খুব দ্রুত হওয়া উচিত।


2
আপনি এটি পাটিগণিতের বিস্তারের পার্শ্ব-প্রতিক্রিয়ার জন্যও ব্যবহার করতে পারেন: : $((a += 1))( ++এবং --অপারেটরদের পসিক্স অনুযায়ী কার্যকর করার প্রয়োজন হয় না)) ব্যাশ, ksh এবং সম্ভাব্য অন্যান্য শেলগুলিতে আপনিও করতে পারেন: ((a += 1))বা ((a++))এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
পাবউক

@ পাবুক ইয়েপ এগুলি সত্য, যদিও (())এটি একটি alচ্ছিক বৈশিষ্ট্য হিসাবে নির্দিষ্ট করা হয়েছে। "যদি" ((") দিয়ে শুরু হওয়া কোনও চরিত্রের ক্রমটি 'by' এর আগে শৈল দ্বারা পাটিগণিতের বিস্তৃতি হিসাবে বিশ্লেষণ করা হয়," ((এক্সপ্রেশন)) "একটি এক্সটেনশন কার্যকর করে এমন শাঁসগুলি গণিতের এক্সপ্রেশন হিসাবে বিবেচনা করা যেতে পারে "" ("" গ্রুপিং কমান্ডের পরিবর্তে পাটিগণিত মূল্যায়ন হিসাবে পরিচয় করিয়ে দেওয়া। "
ormaaj

50

:ব্লক মন্তব্যের জন্যও হতে পারে (সি ভাষার ক্ষেত্রে / * * / এর অনুরূপ)। উদাহরণস্বরূপ, আপনি যদি আপনার স্ক্রিপ্টে কোডের একটি ব্লক এড়িয়ে যেতে চান তবে আপনি এটি করতে পারেন:

: << 'SKIP'

your code block here

SKIP

3
খারাপ ধারণা। এখানে নথির ভিতরে থাকা কোনও কমান্ডের বিকল্পগুলি এখনও প্রক্রিয়াজাত রয়েছে।
চ্যানার

33
এমন খারাপ ধারণা নয়। আপনি ডিলিমিটরের একক উদ্ধৃতি দিয়ে এখানে ডক্সে পরিবর্তনশীল রেজোলিউশন / বিকল্প পরিবর্তন এড়াতে পারবেন: << 'এসকিআইপি'
রনডো

1
IIRC আপনি এটিও করতে পারেন \ একই প্রভাবের জন্য বিভেদক অক্ষর কোন অব্যাহতি: : <<\SKIP
yyny

@ জাগপয়েন্টটি এখান থেকেই পাইথন ডক্টরিস্টিংগুলি মাল্টিলাইন মন্তব্য হিসাবে ব্যবহার করে?
সাফায়ার_ব্রীক

31

আপনি যদি কোনও ফাইল শূন্য বাইটে কাটাতে চান, লগগুলি সাফ করার জন্য দরকারী, এটি চেষ্টা করুন:

:> file.log

16
> file.logসহজ এবং একই প্রভাব অর্জন।
অ্যাম্ফটামাচাইন

55
ইয়াহ, তবে খুশির মুখটি আমার জন্য এটি করে:>
আহি টুনা

23
@ এমফেটাম্যাচিন: :>আরও বহনযোগ্য। কিছু শেল (যেমন আমার zsh) বর্তমান শেলের মধ্যে একটি বিড়ালকে স্ব-ইনস্ট্যান্ট করে এবং কোনও আদেশ না দিয়ে পুনর্নির্দেশ দেওয়া হলে স্টিডিনের জন্য শোন। পরিবর্তে cat /dev/null, :অনেক সহজ। প্রায়শই এই আচরণটি স্ক্রিপ্টগুলির চেয়ে ইন্টারেক্টিভ শেলগুলিতে আলাদা হয় তবে আপনি যদি স্ক্রিপ্টটি এমনভাবে লেখেন যা ইন্টারেক্টিভ কাজ করে তবে অনুলিপি-কপি পেস্ট দ্বারা ডিবাগ করা অনেক সহজ।
কালেব

2
আধুনিক শেলটিতে (চরিত্রের গণনা এবং খুশির মুখ বাদে) কীভাবে : > fileপৃথক হবে true > file(ধরে নিচ্ছেন :এবং trueসমান দ্রুত)
অ্যাডাম কাটজ


29

অন্যান্য উত্তরে আরও দুটি ব্যবহারের উল্লেখ নেই:

লগিং

এই উদাহরণ স্ক্রিপ্ট নিন:

set -x
: Logging message here
example_command

প্রথম লাইন, set -xশেলটি চালানোর আগে কমান্ডটি মুদ্রণ করে তোলে। এটি বেশ কার্যকর নির্মাণ। খারাপ দিকটি হ'ল স্বাভাবিক echo Log messageধরণের বক্তব্য এখন বার বার মুদ্রণ করে। কোলন পদ্ধতিটি গোল হয়ে যায়। মনে রাখবেন যে আপনার নিজের মতো করে এখনও বিশেষ অক্ষরগুলি থেকে বাঁচতে হবে echo

ক্রোন কাজের শিরোনাম

আমি ক্রোন জবগুলিতে এটি ব্যবহার করা দেখেছি:

45 10 * * * : Backup for database ; /opt/backup.sh

এটি একটি ক্রোন কাজ যা /opt/backup.shপ্রতিদিন 10:45 এ স্ক্রিপ্ট চালায় । এই কৌশলটির সুবিধা হ'ল এটি ইমেল বিষয়গুলি আরও ভাল দেখায় যখন /opt/backup.shকিছু আউটপুট প্রিন্ট করে।


ডিফল্ট লগ অবস্থান কোথায়? আমি লগ অবস্থান সেট করতে পারি? স্ক্রিপ্টস / ব্যাকগ্রাউন্ড প্রক্রিয়া চলাকালীন উদ্দেশ্য কি স্টডআউটে আউটপুট তৈরির জন্য?
ডোমডামব্রোগিয়া

1
@ddambrogia ব্যবহার করার সময় set -x, মুদ্রিত আউট কমান্ডগুলি (যেমন কিছু সহ : foobar) স্ট্ডারগুলিতে যান।
ফ্লিম 18

22

আপনি ``কমান্ডের আউটপুট প্রদর্শন না করেই এটি সম্পাদন করতে ব্যাকটিক্স ( ) এর সাথে একযোগে ব্যবহার করতে পারেন :

: `some_command`

অবশ্যই আপনি করতে পারেন some_command > /dev/null, তবে - :রূপান্তরটি কিছুটা ছোট হয়।

বলা হচ্ছে যে আমি আসলে এটি করার সুপারিশ করব না কারণ এটি কেবল মানুষকে বিভ্রান্ত করবে। এটি কেবল একটি সম্ভাব্য ব্যবহারের ক্ষেত্রে হিসাবে মনে আসে।


25
কমান্ডটি কয়েক মেগাবাইট আউটপুট ডাম্প করতে চলেছে, এটি নিরাপদ নয়, যেহেতু শেল আউটপুটটিকে বাফার করে এবং তারপর এটি কমান্ড-লাইন আর্গুমেন্ট (স্ট্যাক স্পেস) হিসাবে ':' তে প্রেরণ করে।
জুলিয়ানো

15

এটি বহুভোগ প্রোগ্রামগুলির জন্যও কার্যকর:

#!/usr/bin/env sh
':' //; exec "$(command -v node)" "$0" "$@"
~function(){ ... }

এটি এখন উভয় একটি এক্সিকিউটেবল শেল-স্ক্রিপ্ট হয় এবং অর্থ: একটি জাভাস্ক্রিপ্ট প্রোগ্রাম ./filename.js, sh filename.jsএবং node filename.jsসমস্ত কাজ।

(অবশ্যই একটি অদ্ভুত ব্যবহারের সামান্য কিছু, তবে তা কার্যকর।)


অনুরোধ হিসাবে কিছু ব্যাখ্যা

  • শেল-স্ক্রিপ্টগুলি লাইন বাই লাইন মূল্যায়ন করা হয়; এবং execকমান্ডটি যখন চালানো হয় তখন শেলটি বন্ধ করে দেয় এবং এর প্রক্রিয়াটি ফলাফল কমান্ডের সাথে প্রতিস্থাপন করে। এর অর্থ শেলটির কাছে, প্রোগ্রামটি এরকম দেখাচ্ছে:

    #!/usr/bin/env sh
    ':' //; exec "$(command -v node)" "$0" "$@"
  • যতক্ষণ না শব্দটিতে কোনও প্যারামিটার সম্প্রসারণ বা আলিয়াজিং না ঘটে ততক্ষণ শেল-স্ক্রিপ্টের কোনও শব্দই এর অর্থ 'পরিবর্তন না করেই উদ্ধৃতিতে আবৃত হতে পারে; এর অর্থ এটি ':'সমান :(আমরা নীচে বর্ণিত জাভাস্ক্রিপ্ট শব্দার্থবিজ্ঞান অর্জনের জন্য এটি কেবল এখানে উদ্ধৃতিগুলিতে গুটিয়ে রেখেছি)

  • ... এবং উপরে বর্ণিত হিসাবে, প্রথম লাইনে প্রথম কমান্ডটি একটি নো-অপ্ট (এটি অনুবাদ করে : //, বা আপনি যদি শব্দগুলি উদ্ধৃত করতে পছন্দ করেন, ':' '//'লক্ষ্য করুন যে //এখানে জাভাস্ক্রিপ্টে যেমন কোনও বিশেষ অর্থ বহন করা হয়নি; এটি কেবল একটি অর্থহীন শব্দ যা ফেলে দেওয়া হচ্ছে))

  • অবশেষে, প্রথম লাইনের দ্বিতীয় কমান্ডটি (সেমিকোলনের পরে) হ'ল প্রোগ্রামটির আসল মাংস: এটি সেই execকল যা শেল-স্ক্রিপ্টটির পরিবর্তিত হয় , একটি নোড.জেএস প্রক্রিয়া সহ অন্যান্য স্ক্রিপ্টের মূল্যায়ন করার জন্য অনুরোধ করা হয়।

  • এদিকে, জাভাস্ক্রিপ্টে প্রথম লাইনটি স্ট্রিং-আক্ষরিক ( ':') হিসাবে পার্স করে এবং তারপরে একটি মন্তব্য, যা মুছে ফেলা হয়; সুতরাং, জাভাস্ক্রিপ্ট, প্রোগ্রামটি দেখতে এইভাবে:

    ':'
    ~function(){ ... }

    যেহেতু স্ট্রিং-আক্ষরিকটি নিজেই একটি লাইনে রয়েছে, এটি কোনও অনিঃপুত বিবৃতি, এবং এইভাবে প্রোগ্রাম থেকে ছিটকে যায়; এর অর্থ হ'ল কেবলমাত্র আপনার প্রোগ্রাম-কোড রেখে পুরো লাইনটি সরিয়ে ফেলা হয়েছে (উদাহরণস্বরূপ, function(){ ... }বডি))


হ্যালো, আপনি কি ব্যাখ্যা করতে পারেন : //;এবং ~function(){}কি করতে পারেন ? আপনাকে ধন্যবাদ:)
স্টাফেন

1
@ স্টাফেন একটি ব্রেক-ডাউন যুক্ত করেছে! হিসাবে ~function(){}, এটি কিছুটা জটিল। আছে একটি দম্পতি এখানে এটিকে স্পর্শ, যদিও সত্যিই তাদের কেউ আমার সন্তুষ্টি তা ব্যাখ্যা ... যদি এই প্রশ্নগুলোর তন্ন তন্ন এটা ভালভাবে যথেষ্ট আপনি এখানে একটি প্রশ্ন যেমন পোষ্ট করতে দ্বিধা বোধ করবেন না জন্য ব্যাখ্যা করেছেন যে, আমি থাকব অন্যান্য উত্তর নতুন প্রশ্নের গভীরতর উত্তর দিতে পেরে খুশি।
এলিওটিটিসিবল

1
আমি মনোযোগ দিলাম না node। সুতরাং ফাংশন অংশ সমস্ত জাভাস্ক্রিপ্ট সম্পর্কে! আমি আইআইএফই-এর সামনে অ্যাকারি অপারেটরের সাথে ওকি আছি। আমি ভেবেছিলাম এটি প্রথম স্থানেও ছিল এবং এটি আসলে আপনার পোস্টটির অর্থ পায়নি your আমি এখন ওকি, «ব্রেক-ডাউন adding যোগ করার জন্য আপনার সময় ব্যয় করার জন্য আপনাকে ধন্যবাদ!
স্টাফেন


12

স্ব-ডকুমেন্টিং ফাংশন

আপনি :কোনও ফাংশনে ডকুমেন্টেশন এম্বেড করতেও ব্যবহার করতে পারেন ।

ধরে নিন আপনার কাছে একটি লাইব্রেরি স্ক্রিপ্ট রয়েছে mylib.shযা বিভিন্ন ধরণের ফাংশন সরবরাহ করে। আপনি হয় লাইব্রেরির উত্স ( . mylib.sh) তৈরি করতে পারেন এবং এর পরে সরাসরি ফাংশনগুলি কল করতে পারেন ( lib_function1 arg1 arg2), বা আপনার নামের স্থানটি বিশৃঙ্খলা এড়াতে এবং ফাংশন আর্গুমেন্ট ( mylib.sh lib_function1 arg1 arg2) দিয়ে লাইব্রেরিতে প্রার্থনা করতে পারেন ।

mylib.sh --helpসহায়তার পাঠ্যে ফাংশন তালিকাটি ম্যানুয়ালি না রেখে আপনি টাইপ করে এবং উপলব্ধ ফাংশনগুলির ব্যবহার এবং তাদের ব্যবহারগুলির একটি তালিকা পেতে পারতেন তবে কি ভাল লাগবে না ?

#! / বিন / ব্যাশ

# সমস্ত "সর্বজনীন" ফাংশন অবশ্যই এই উপসর্গ দিয়ে শুরু করা উচিত
LIB_PREFIX = 'lib_'

# "সর্বজনীন" গ্রন্থাগারের কার্যাদি
lib_function1 () {
    : এই ফাংশনটি দুটি যুক্তি দিয়ে জটিল কিছু করে।
    :
    : পরামিতি:
    : 'আরগ 1 - প্রথম যুক্তি ($ 1)'
    : 'আরগ 2 - দ্বিতীয় তর্ক'
    :
    : ফলাফল:
    : " এটা জটিল"

    # আসল ফাংশন কোডটি এখানে শুরু হয়
}

lib_function2 () {
    : ফাংশন ডকুমেন্টেশন

    # ফাংশন কোড এখানে
}

# সহায়তা ফাংশন
--হেল্প () {
    প্রতিধ্বনি MyLib v0.0.1
    প্রতিধ্বনি
    প্রতিধ্বনির ব্যবহার: mylib.sh [ফাংশন_নাম [আরগস]]
    প্রতিধ্বনি
    প্রতিধ্বনি উপলব্ধ ফাংশন:
    ঘোষণা -ফ | sed -n -e '/ ^' $ LIB_PREFIX '/, / ^} $ / {/ \ (^' $ LIB_PREFIX '\) \ | \ (^ [\ t] *: \) / {
        s / ^ \ ('I LIB_PREFIX'। * \) () / \ n === \ 1 === /; এস / ^ [\ টি] *: \? ['\' '"] \? / / ; র / [ '\' ' "] \; \ $ //; পি}}'
}

# প্রধান কোড
যদি ["$ {BASH_SOURCE [0]}" = "$ {0}"]; তারপর
    # স্ক্রিপ্টটি সোর্সের পরিবর্তে কার্যকর করা হয়েছিল
    # অনুরোধ করা ফাংশন বা প্রদর্শনের জন্য সাহায্য প্রার্থনা করুন
    যদি ["$ (টাইপ-টি -" $ 1 "2> / দেব / নাল)" = ফাংশন]; তারপর
        "$ @"
    আর
        --help
    ফাই
ফাই

কোড সম্পর্কে কয়েকটি মন্তব্য:

  1. সমস্ত "পাবলিক" ফাংশনগুলির উপসর্গ একই থাকে। কেবলমাত্র এগুলি ব্যবহারকারীর দ্বারা আহ্বান জানানো এবং সহায়তা পাঠ্যের তালিকায় অন্তর্ভুক্ত।
  2. স্ব-ডকুমেন্টিং বৈশিষ্ট্যটি পূর্ববর্তী পয়েন্টের উপর নির্ভর করে এবং declare -fসমস্ত উপলব্ধ ফাংশন গণনার জন্য ব্যবহার করে, তবে সেগুলি সেডের মাধ্যমে উপযুক্ত উপসর্গের সাথে কেবল ফাংশন প্রদর্শন করতে ফিল্টার করে।
  3. অনাকাঙ্ক্ষিত সম্প্রসারণ এবং হোয়াইটস্পেস অপসারণ রোধ করার জন্য ডকুমেন্টেশনগুলি একক উদ্ধৃতিতে সংযুক্ত করা ভাল ধারণা। পাঠ্যে অ্যাস্ট্রোফেস / উদ্ধৃতি ব্যবহার করার সময় আপনাকেও যত্নবান হওয়া দরকার।
  4. আপনি লাইব্রেরির উপসর্গটি অভ্যন্তরীণ করতে কোড লিখতে পারেন, অর্থাত্ ব্যবহারকারীকে কেবল টাইপ করতে হয় mylib.sh function1এবং এটি অভ্যন্তরীণভাবে অনুবাদ হয় lib_function1। এটি পাঠকের জন্য অনুশীলন left
  5. সহায়তা ফাংশনটির নাম দেওয়া হয়েছে "--help"। এটি একটি সুবিধাজনক (অর্থাত্ অলস) পদ্ধতির যা কোনও অতিরিক্ত চেক কোড না করেই সাহায্যটি প্রদর্শন করার জন্য লাইব্রেরির আহ্বান প্রক্রিয়াটি ব্যবহার করে $1। একই সাথে, আপনি গ্রন্থাগারটি উত্স করে দিলে এটি আপনার নাম স্থানটি বিশৃঙ্খলা করবে। যদি আপনি এটি পছন্দ না করেন তবে আপনি হয় নামটি পরিবর্তন করে এমন কিছুতে পরিবর্তন করতে পারেন lib_helpবা --helpমূল কোডের জন্য আরোগুলি চেক করতে পারেন এবং সহায়তা ফাংশনটি ম্যানুয়ালি অনুরোধ করতে পারেন।

4

আমি এই স্ক্রিপ্টটিতে এই ব্যবহারটি দেখেছি এবং মনে করেছি এটি কোনও স্ক্রিপ্টের মধ্যে বেসনামটি চাওয়ার জন্য একটি ভাল বিকল্প।

oldIFS=$IFS  
IFS=/  
for basetool in $0 ; do : ; done  
IFS=$oldIFS  

... এটি কোডের প্রতিস্থাপন: basetool=$(basename $0)


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