বাশ-এ, কখন ওরফে, কখন স্ক্রিপ্ট, এবং কখন কোন ফাংশন লিখব?


360

এই প্রশ্নটি জিজ্ঞাসা করতে আমার প্রায় 10 বছর লিনাক্স ব্যবহার হয়েছে। এটি ছিল সমস্ত ট্রায়াল এবং ত্রুটি এবং এলোমেলো রাত্রে ইন্টারনেট সার্ফিং।

তবে এর জন্য লোকদের 10 বছরের দরকার নেই। যদি আমি কেবল লিনাক্স দিয়ে শুরু করি, আমি জানতে চাই: কখন ওরফে, কখন স্ক্রিপ্ট এবং কখন কোন ফাংশন লিখব?

এলিয়াস যেখানে উদ্বিগ্ন সেখানে আমি খুব সাধারণ ক্রিয়াকলাপের জন্য উপকরণগুলি ব্যবহার করি যা যুক্তি নেয় না।

alias houston='cd /home/username/.scripts/'

এটা সুস্পষ্ট বলে মনে হচ্ছে। তবে কিছু লোক এটি করেন:

alias command="bash bashscriptname"

(এবং এটি .bashrcফাইলের সাথে যুক্ত করুন)

এটি করার কোনও ভাল কারণ আছে? আমি সত্যিই চেষ্টা করছি, তবে আমি যে পরিস্থিতিটি করতে চাই তা সত্যই ভাবতে পারি না। সুতরাং, যদি কোনও প্রান্তের কেস থাকে যেখানে এটি কোনও পার্থক্য তৈরি করে, দয়া করে নীচে উত্তর দিন।

কারণ এখানেই আমি আমার পাঠ্যপুস্তকে কিছু রেখেছি এবং chmod +xএটি, এটি লিনাক্সের পরীক্ষার-ত্রুটির কয়েক বছর পরে এসেছিল another

যা আমাকে পরবর্তী বিষয় নিয়ে আসে। উদাহরণস্বরূপ, আমি .scripts/হোম ডিরেক্টরিতে আমার পাত্রে একটি লুকানো ফোল্ডার ( ) কেবলমাত্র আমার .bashrc( PATH=$PATH:/home/username/.scripts/) তে একটি লাইন যুক্ত করে যুক্ত করেছি , যাতে সেখানে স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে পূর্ণরূপে কার্যকরযোগ্য কিছু হয়।

আমার দরকার হলে।

আমার আসলে দরকার নেই, যদিও, আমার কি দরকার? আমি কেবল সেগুলিকে পাইথনের মতো শেল নয় এমন ভাষার জন্য ব্যবহার করব।

যদি এটি শেল হয় তবে আমি কেবল একই ভিতরে একটি ফাংশন লিখতে পারি .bashrc:

funcname () {
  somecommand -someARGS "$@"
}

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

স্ক্রিপ্টগুলির পুরো ডিরেক্টরিটি কম্পিউটার থেকে কম্পিউটারে স্থানান্তরিত করার পরিবর্তে আমি অন্য সবার .bashrc এর পরিবর্তে নিজের সাথে প্রতিস্থাপন করেছিলাম, কারণ তারা কখনও একটি পরিবর্তনও করেনি।

তবে আমি কি কিছু মিস করেছি?

সুতরাং, আপনি কোনও প্রারম্ভিক লিনাক্স ব্যবহারকারীকে কখন উপনাম, কখন স্ক্রিপ্ট এবং কখন কোন ফাংশন লিখবেন সে সম্পর্কে বলবেন?

যদি এটি সুস্পষ্ট না হয়, আমি তাদের ধরে নিচ্ছি যারা উত্তর দিয়েছিল তাদের তিনটি বিকল্পই ব্যবহার করবে। আপনি যদি কেবলমাত্র এলিয়াস ব্যবহার করেন, বা কেবল স্ক্রিপ্ট ব্যবহার করেন, বা কেবল ফাংশন ব্যবহার করেন — বা আপনি যদি কেবলমাত্র এলিয়াস এবং স্ক্রিপ্ট বা উপাধি এবং ফাংশন বা স্ক্রিপ্ট এবং ফাংশন ব্যবহার করেন is এই প্রশ্নটি আসলে আপনার লক্ষ্য নয়।



10
+1, উল্লিখিত, স্ক্রিপ্ট, ফাংশন all এর সমস্ত উপগঠন স্পষ্টভাবে উল্লেখ করার জন্য যেখানে এই প্রশ্নটি লক্ষ্য করে না। সন্তানের মত বিশ্বাসের জন্য +1 আপনার নাল সাবসেটটি বাদ দেওয়া ঠিক ছিল।
থমাস এল Holaday

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

.Bashrc যদি সত্যিই সেরা জায়গা, বা কমপক্ষে একটি শক্ত জায়গা, তবে? লিনাক্সে একই জিনিসটি করার অনেকগুলি উপায় রয়েছে, যা আমি প্রশংসা করি, তবে, সমস্ত জিনিস সমান হচ্ছে, আমি জিনিসগুলি সবচেয়ে সাধারণ উপায়ে করতে পছন্দ করি।
কিট

উত্তর:


242

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

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

যখন আপনাকে একটি উপনামের চেয়ে আরও জটিল কিছু করার দরকার হয় তখন একটি ফাংশন ব্যবহার করা উচিত তবে এটি তার নিজের ব্যবহারে হবে না। উদাহরণস্বরূপ, পাইপলাইনে রয়েছে কিনা তার উপর নির্ভর করে এর ডিফল্ট আচরণ পরিবর্তন করার বিষয়ে আমি যে প্রশ্নের জিজ্ঞাসা করেছি তার উত্তর দিন grep:

grep() { 
    if [[ -t 1 ]]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

এটি কোনও ফাংশনের একটি নিখুঁত উদাহরণ কারণ এটি একটি উপনামের জন্য অত্যন্ত জটিল (শর্তের ভিত্তিতে বিভিন্ন ডিফল্টের প্রয়োজন) তবে এটি এমন কোনও বিষয় নয় যা আপনাকে একটি ইন্টারঅ্যাক্টিভ স্ক্রিপ্টে প্রয়োজন হবে।

আপনি যদি খুব বেশি ফাংশন বা ফাংশন খুব বড় পান তবে এগুলি একটি গোপন ডিরেক্টরিতে পৃথক ফাইলে রাখুন এবং সেগুলি আপনার এটিকে উত্স করুন ~/.bashrc:

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

একটি স্ক্রিপ্ট নিজে থেকে দাঁড়ানো উচিত। এর আবার এমন কিছু হিসাবে মূল্য থাকতে হবে যা একাধিক উদ্দেশ্যে ব্যবহার করা যেতে পারে বা ব্যবহার করা যেতে পারে।


14
এছাড়া যে মনে রাখা গুরুত্বপূর্ণ - যদি না দিয়ে sourced .বা source- একটি স্ক্রিপ্ট পৃথক ব্যাশ প্রক্রিয়া দ্বারা মৃত্যুদন্ড কার্যকর করা হয় এবং তার নিজস্ব পরিবেশ রয়েছে। এই কারণে শেল এনভায়রনমেন্ট (যেমন ফাংশন, ভেরিয়েবলস ইত্যাদি) পরিবর্তন করে এমন যে কোনও কিছুই শেল এনভায়রনমেন্ট থেকে আপনি স্ক্রিপ্টটি চালাবেন না।
উইসডেন

260

অন্যান্য উত্তরগুলি ব্যক্তিগত স্বাদের উপর ভিত্তি করে কিছু নরম সাধারণ নির্দেশিকা সরবরাহ করে তবে অনেকগুলি প্রাসঙ্গিক তথ্য উপেক্ষা করে যা স্ক্রিপ্ট, ফাংশন বা উপকরণগুলির মধ্যে সিদ্ধান্ত নেওয়ার সময় বিবেচনা করা উচিত।

উপকরণ এবং কার্যাদি ¹

  • এলিয়াস এবং ফাংশনগুলির সম্পূর্ণ সামগ্রী শেলের স্মৃতিতে সঞ্চিত থাকে।
  • এর প্রাকৃতিক পরিণতি হ'ল এলিয়াস এবং ফাংশনগুলি কেবল বর্তমান শেল দ্বারা ব্যবহৃত হতে পারে, এবং আপনি শেল থেকে পাঠাতে চাইছেন এমন কোনও প্রোগ্রাম দ্বারা নয় যেমন পাঠ্য সম্পাদক, স্ক্রিপ্ট বা এমনকি একই শেলের শিশু দৃষ্টান্ত।
  • উপকরণ এবং ফাংশন বর্তমান শেল দ্বারা সম্পাদন করা হয়, অর্থাৎ এগুলি শেলের বর্তমান পরিবেশের মধ্যে চলে এবং প্রভাবিত করে ² উপন্যাস বা ফাংশনটি চালানোর জন্য কোনও পৃথক প্রক্রিয়া প্রয়োজন হয় না।

স্ক্রিপ্ট

  • শেলগুলি স্মৃতিতে স্ক্রিপ্ট রাখে না। পরিবর্তে, স্ক্রিপ্টগুলি ফাইলগুলি সেগুলি থেকে পড়া হয় যেখানে তারা প্রয়োজন হয় প্রতিবার সংরক্ষণ করা হয়। যদি স্ক্রিপ্টটি কোনও $PATHঅনুসন্ধানের মাধ্যমে পাওয়া যায় , অনেক শেল ভবিষ্যতের চেহারাতে সময় বাঁচাতে স্মরণে এর পথের নামের একটি হ্যাশ সংরক্ষণ করে $PATHতবে ব্যবহার না করা অবস্থায় এটি কোনও স্ক্রিপ্টের মেমরির পদচিহ্নের সীমা।
  • স্ক্রিপ্টগুলি আরও বেশি উপায়ে ফাংশন এবং এলিয়াসগুলি ক্যান্সার করা যেতে পারে। এগুলি দোভাষী হিসাবে যুক্তি হিসাবে পাস করা যেতে পারে, যেমন sh scriptবা সরাসরি নির্বাহী হিসাবে আহবান করা যায়, সেক্ষেত্রে শেবাং লাইনে দোভাষীকে #!/bin/shএটি চালনার জন্য অনুরোধ করা হয়েছে। উভয় ক্ষেত্রেই, স্ক্রিপ্টটি একটি পৃথক দোভাষী প্রক্রিয়া দ্বারা চালিত হয় যার নিজস্ব পরিবেশটি আপনার শেলের থেকে পৃথক হয়, যার স্ক্রিপ্টটি কোনওভাবেই প্রভাব ফেলতে পারে না। প্রকৃতপক্ষে, দোভাষী শেলটিও আমন্ত্রণকারী শেলের সাথে মেলে না। যেহেতু স্ক্রিপ্টগুলি এইভাবে আহ্বান জানানো হয়েছে যে কোনও সাধারণ নির্বাহযোগ্যের মতো আচরণ করে, সেগুলি কোনও প্রোগ্রাম দ্বারা ব্যবহার করা যেতে পারে।

    অবশেষে, একটি স্ক্রিপ্ট বর্তমান শেল দ্বারা .এবং কিছু শেল সহ , পড়া এবং চালানো যেতে পারে source। এই ক্ষেত্রে, স্ক্রিপ্টটি এমন একটি ফাংশনের মতো আচরণ করে যা অনবরত স্মৃতিতে রাখার পরিবর্তে অন-ডিমান্ডে পড়া হয়।

আবেদন

উপরের দিক থেকে দেওয়া, আমরা কিছু সাধারণ স্ক্রিপ্ট বা ফাংশন / ওরফে তৈরি করতে হবে তার জন্য কিছু সাধারণ নির্দেশিকা নিয়ে আসতে পারি।

  • আপনার শেল ছাড়াও অন্যান্য প্রোগ্রামগুলি কী এটি ব্যবহারে সক্ষম হতে হবে? যদি তা হয় তবে এটি স্ক্রিপ্ট হতে হবে।

  • আপনি কি চান এটি কেবল একটি ইন্টারেক্টিভ শেল থেকে পাওয়া যায়? বহিরাগত কমান্ড / স্ক্রিপ্টগুলিকে প্রভাবিত না করে ইন্টারেক্টিভভাবে চালিত হওয়ার সাথে অনেক কমান্ডের ডিফল্ট আচরণ পরিবর্তন করা সাধারণ বিষয়। এই ক্ষেত্রে, শেলের "ইন্টারেক্টিভ-মোড-কেবল" আরসি ফাইলে একটি নাম / ফাংশন সেট ব্যবহার করুন (এটির bashজন্য .bashrc)।

  • শেলের পরিবেশ পরিবর্তন করার দরকার আছে কি? উভয় একটি ফাংশন / ওরফে বা উত্সযুক্ত স্ক্রিপ্ট সম্ভাব্য পছন্দ।

  • এটি কি আপনি ঘন ঘন ব্যবহার কিছু? এটি স্মৃতিতে রাখা সম্ভবত আরও দক্ষ, সুতরাং যদি সম্ভব হয় তবে এটি একটি ফাংশন / ওরফে তৈরি করুন।

  • বিপরীতে, এটি এমন কিছু যা আপনি খুব কমই ব্যবহার করেন? সেক্ষেত্রে আপনার যখন প্রয়োজন হয় না তখন এটি হগ মেমরি থাকার কোনও বোধ হয় না, তাই এটি একটি স্ক্রিপ্ট তৈরি করুন।


Functions ফাংশন এবং উপাধিতে কিছু গুরুত্বপূর্ণ পার্থক্য থাকলেও সেগুলি একত্রে শ্রেণিবদ্ধ করা হয় কারণ ফাংশনগুলি এলিয়াসগুলি যা কিছু করতে পারে তা করতে পারে। উপাধিতে স্থানীয় ভেরিয়েবল থাকতে পারে না এবং তর্কগুলি প্রক্রিয়া করতে পারে না এবং এগুলি এক লাইনের চেয়ে দীর্ঘতর কোনও কিছুর জন্য অসুবিধে হয়।

² এর একটি ইউনিক্স সিস্টেমের মধ্যে প্রতিটি চলমান প্রক্রিয়া একটি হয়েছে পরিবেশ একটি গুচ্ছ গঠিত variable=valueজোড়া যা প্রায়ই বিশ্বব্যাপী কনফিগারেশন সেটিংস রয়েছে, মত LANGডিফল্ট লোকেল এবং PATHএক্সিকিউটেবল সন্ধানের পাথ উল্লেখ জন্য।


26
আইএমএইচও এটি সর্বোত্তম উত্তর।
লুক এম

4
প্রশ্ন / উত্তরের ফর্ম্যাটটি দুর্দান্ত ধারণা। আমি এটা চুরি করতে পারে। ;-)
মাইকেল

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

3
প্রশ্নের তালিকায় যোগ করার জন্য আরও একটি আইটেম: ফ্লাইয়ের কমান্ডটিতে আপনার কি কখনও কার্যকারিতা পরিবর্তন করতে হবে? স্ক্রিপ্টে পরিবর্তনগুলি সমস্ত সেশনে প্রতিফলিত হবে, যেখানে ফাংশন এবং উপকরণগুলি প্রতি সেশনের ভিত্তিতে পুনরায় লোড বা পুনরায় সংজ্ঞায়িত করতে হবে।
Stratus3D

3
ভাল উত্তর. আরও একটি গুরুত্বপূর্ণ বিষয় (আমার জন্য): অন্যান্য ব্যবহারকারীর জন্য "শর্টকাট" তৈরি করার সময়, একটি উপাধি ব্যবহার করা ভাল কারণ বিদ্যমান স্বতঃপূরণ কেবলমাত্র এলিয়াসগুলির সাথে কাজ করবে, তবে স্ক্রিপ্ট বা ফাংশনগুলির সাথে নয় (উপকরণের জন্য +1)। উদাহরণস্বরূপ , alias g='gradle'আমার gউপনামটি ব্যবহার করার সময় আমি গ্রেড গ্রেড অটোকম্প্লিপশন পেয়েছি তবে স্ক্রিপ্ট gradle $*বা এর সাথে কোনও ফাংশন ব্যবহার করার সময় বাক্সের বাইরে পাব নাgradle $@
Yoav Aharoni

37

আমি মনে করি এটি প্রতিটি ব্যক্তির স্বাদ অনুসারে। আমার জন্য যুক্তিটি এইভাবে চলে:

  • প্রথমে আমি একটি উপনাম তৈরি করার চেষ্টা করি, কারণ এটি সবচেয়ে সহজ।
  • জিনিসটি যদি এক লাইনে ফিট করার মতো জটিল হয় তবে আমি এটিকে একটি ফাংশন করার চেষ্টা করি।
  • যখন ফাংশনটি কয়েক ডজন লাইন ছাড়িয়ে বাড়তে শুরু করে আমি এটি একটি স্ক্রিপ্টে রেখেছি।

সত্যিই এমন কিছু বিষয় যা কাজ করা থেকে আপনি সীমিত করতে কিছুই নয় কাজ করে


6
আমি প্রায়শই ফাংশন বিকল্পটি এড়িয়ে চলে যাই এবং এখনই একটি স্ক্রিপ্ট তৈরি করি। তবে আমি একমত যে এটি আংশিক স্বাদের বিষয়
বার্নহার্ড

2
কোনও ফাংশনটি যদি আপনাকে বিভিন্ন স্ক্রিপ্টে প্রয়োজন হয় তা বোঝাতে শুরু করে।
নীল

7
... বা আপনার যদি বর্তমান শেলটি পরিবর্তন করতে পার্শ্ব প্রতিক্রিয়াগুলির প্রয়োজন হয় ।
গ্লেন জ্যাকম্যান

বোধ হয়, মানুষ!
এক্সপ্লোরার

15

কমপক্ষে আংশিকভাবে এটি ব্যক্তিগত স্বাদের বিষয়। অন্যদিকে কিছু স্পষ্ট কার্যকরী পার্থক্য রয়েছে:

  • উপাধি: কেবল সাধারণ পাঠ্য প্রতিস্থাপনের জন্য উপযুক্ত, কোনও আর্গুমেন্ট / প্যারামিটার নেই
  • ফাংশন: লিখতে / ব্যবহার করা সহজ, সম্পূর্ণ শেল স্ক্রিপ্টিং ক্ষমতা, কেবল ব্যাশের ভিতরে উপলব্ধ
  • স্ক্রিপ্টগুলি: কম বেশি ফাংশনগুলির মতো, তবে ব্যাশের বাইরেও (কলযোগ্য) উপলব্ধ

শেল স্ক্রিপ্টিংটির দিকে তাকিয়ে আমি গত কয়েক বছর ধরে করেছি আমার অ্যালিয়াসগুলি কম-বেশি লেখা বন্ধ হয়ে গেছে (কারণ এগুলি সকলেই সময়ের সাথে ফাংশনে পরিণত হয়) এবং স্ক্রিপ্টগুলি কেবল তখনই না-বাশ পরিবেশ থেকে পাওয়া যায় from

PS: alias command="bash bashscriptname"আমি আসলে এটি করার কোনও কারণ দেখতে পাচ্ছি না। এমনকি bashscriptname$ PATH এ না থাকলেও একটি সরল alias c=/path/to/scriptযথেষ্ট।


1
ইন alias command="bash bashscriptname"স্ক্রিপ্ট অগত্যা এক্সিকিউটেবল হতে হবে না; মধ্যে alias c=/path/to/scriptএটি হয়েছে।
মার্টিন - :

এটি ফাংশনগুলি "কেবলমাত্র ব্যাশের অভ্যন্তরে উপলব্ধ" এগুলি মোটেই সত্য নয়। যদি আপনি বলতে চান যে এগুলি কেবল বাশ-কেবল বৈশিষ্ট্য, তবে এটি কেবল মিথ্যা (বোর্ন শেল এবং প্রতিটি সামঞ্জস্যপূর্ণ ডেরিভেটিভ এগুলি রয়েছে); এবং যদি আপনি বলতে চাচ্ছেন যে এগুলি ইন্টারেক্টিভ শেলের একটি বৈশিষ্ট্য, তবে এটি সঠিক নয় (যদিও ইন্টারেক্টিভ শেল দ্বারা প্রারম্ভকালে লোড হয়ে যায় এমন কোনও ফাইলের সংজ্ঞা, ভেরিয়েবল এবং ফাংশনগুলি স্পষ্টতই নন-ইন্টারেক্টিভ শেল দ্বারা লোড হবে না)।
ট্রিপলি

@ ট্রাইপ্লি অর্থটি আরও বেশি ছিল "আপনি exec()ফাংশনগুলি শেল করতে পারবেন না " :-)
নোহিলসাইডে

11

এলিয়াস এবং ফাংশন সম্পর্কে কিছু অতিরিক্ত পয়েন্ট এখানে দেওয়া হয়েছে:

  • একই নামকরণ করা উপনাম এবং ফাংশন সহ-বিদ্যমান থাকতে পারে
  • ওরফে নেমস্পেসটি প্রথমে দেখানো হয়েছে (প্রথম উদাহরণ দেখুন)
  • উপাধি (আন) সাব-শেল বা অ-ইন্টারেক্টিভ পরিবেশে সেট করা যাবে না (দ্বিতীয় উদাহরণ দেখুন)

উদাহরণ স্বরূপ:

alias f='echo Alias'; f             # prints "Alias"
function f { echo 'Function'; }; f  # prints "Alias"
unalias f; f                        # prints "Function"

যেমন আমরা দেখতে পাচ্ছি, এলিয়াস এবং ফাংশনগুলির জন্য পৃথক নেমস্পেস রয়েছে; আরও বিশদ ব্যবহার করে পাওয়া যায় declare -A -p BASH_ALIASESএবং declare -f fযা তাদের সংজ্ঞাগুলি মুদ্রণ করে (উভয়ই স্মৃতিতে সঞ্চিত থাকে)।

এলিয়াসগুলির সীমাবদ্ধতা দেখানোর উদাহরণ:

alias a='echo Alias'
a        # OK: prints "Alias"
eval a;  # OK: prints "Alias"
( alias a="Nested"; a );  # prints "Alias" (not "Nested")
( unalias a; a );         # prints "Alias"
bash -c "alias aa='Another Alias'; aa"  # ERROR: bash: aa: command not found

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

অবশেষে, নোট করুন যে কোনও ফাংশনটিকে তাত্ক্ষণিকভাবে ডেকে আনার মাধ্যমে আপনি একটি উলামে নির্বিচারে গণনা করতে পারেন:

alias a_complex_thing='f() { do_stuff_in_function; } f'

গিট এলিয়াসের ক্ষেত্রে এটি ইতিমধ্যে ব্যাপকভাবে ব্যবহৃত। কোনও ক্রিয়াকলাপ ঘোষণার মাধ্যমে এটি করার সুবিধাটি হ'ল আপনার উলামের নাম সোর্স-ইনিং (বা ব্যবহার করে .) কোনও স্ক্রিপ্ট যা একই নামযুক্ত ক্রিয়াকলাপটি ঘোষণার জন্য ঘটে তার দ্বারা ওভাররাইট করা যায় না ।


10

কখন স্ক্রিপ্ট লিখবেন ...

  • স্ক্রিপ্টগুলি আরও জটিল উপাদানগুলিতে সফটওয়্যার উপাদানগুলি (যেমন। সরঞ্জাম, কমান্ড, প্রক্রিয়া, এক্সিকিউটেবল, প্রোগ্রাম) একত্রিত করে, যা তারা আরও জটিল উপাদানগুলিতে একত্রিত হতে পারে।
  • স্ক্রিপ্টগুলি সাধারণত সম্পাদনযোগ্য করে দেওয়া হয় যাতে এগুলিকে নামে ডাকা যায়। যখন ডাকা হয়, স্ক্রিপ্টটি চালু হওয়ার জন্য একটি নতুন সাবপ্রসেস তৈরি করা হয় any যে কোনও exportএডি ভেরিয়েবল এবং / অথবা ফাংশনগুলির অনুলিপিগুলি স্ক্রিপ্টে মান দ্বারা প্রেরণ করা হয় । এই ভেরিয়েবলগুলির পরিবর্তনগুলি মূল স্ক্রিপ্টে ফিরে প্রচার করে না
  • স্ক্রিপ্টগুলি লোড করা হতে পারে (উত্সাহিত) যেন তারা কলিং স্ক্রিপ্টের অংশ। এটি অন্যান্য কিছু ভাষাকে "আমদানি" বা "অন্তর্ভুক্ত" বলে যা অনুরূপ alog উত্সাহিত হয়ে গেলে তারা বিদ্যমান প্রক্রিয়াটির মধ্যেই সম্পাদন করে। কোনও উপ-প্রসেস স্প্যানড হয় না।

কোন ফাংশন কখন লিখবেন ...

  • কার্যকারিতা কার্যকরভাবে প্রাক লোড শেল স্ক্রিপ্টগুলি। তারা পৃথক স্ক্রিপ্ট কল করার চেয়ে কিছুটা ভাল সম্পাদন করে তবে কেবল এটি যান্ত্রিক ডিস্ক থেকে পড়তে হবে। অব্যবহৃত র‌্যামে আজকের ফ্ল্যাশড্রাইভ, এসএসডি এবং লিনাক্সের সাধারণ ক্যাচিংয়ের প্রসারণটি এই উন্নতিটিকে বহুলাংশে অপ্রয়োজনীয় করে তুলেছে।
  • ফাংশনগুলি মড্যুলারালিটি, এনক্যাপসুলেশন এবং পুনঃব্যবহার অর্জনের জন্য বাশের মূল নীতি হিসাবে কাজ করে। তারা স্ক্রিপ্টগুলির স্বচ্ছতা, নির্ভরযোগ্যতা এবং রক্ষণাবেক্ষণের উন্নতি করে।
  • একটি ফাংশন কল করার সিনট্যাক্স বিধিগুলি এক্সিকিউটেবলকে কল করার অনুরূপ। এক্সিকিউটেবল হিসাবে একই নামে একটি ফাংশন এক্সিকিউটেবলের পরিবর্তে ডাকা হবে।
  • ফাংশনগুলি যে স্ক্রিপ্টটিতে থাকে সেগুলির স্থানীয় হয়।
  • ফাংশনগুলি রফতানি করা যেতে পারে ( মান দ্বারা অনুলিপি করা হয়েছে ) যাতে এগুলি স্ক্রিপ্টগুলি হিসাবে ব্যবহার করা যেতে পারে। সুতরাং, ফাংশনগুলি কেবলমাত্র শিশু প্রসেসগুলিতেই প্রচার করে, কখনই পিতামাতার নয়।
  • ফাংশনগুলি পুনরায় ব্যবহারযোগ্য কমান্ড তৈরি করে যা প্রায়শই অন্যান্য স্ক্রিপ্টগুলির দ্বারা উত্সাহিত করার জন্য লাইব্রেরিতে (কেবলমাত্র ফাংশন সংজ্ঞা সহ একটি স্ক্রিপ্ট) একত্রিত হয়।

কখন একটি উপনাম লিখতে হবে ...

লাইব্রেরি স্ক্রিপ্টগুলির মতো স্ক্রিপ্টগুলির মধ্যে, কখনও কখনও কোনও ফাংশনের জন্য একটি এলিফ প্রয়োজন হয় যেমন কোনও ফাংশনটির পুনরায় নামকরণ করা হলেও পিছনের সামঞ্জস্যতা প্রয়োজন। পুরানো নাম দিয়ে একটি সাধারণ ফাংশন তৈরি করে এটি সম্পাদন করা যেতে পারে যা তার সমস্ত আর্গুমেন্টকে নতুন ফাংশনে পাস করে ...

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }

9

আর একটি জিনিস যা আমি বিশ্বাস করি না তা সামনে এনেছে: উদ্দীপনা প্রক্রিয়া প্রসঙ্গে একটি ফাংশন কার্যকর করে, যেখানে স্ক্রিপ্ট একটি নতুন শেল তৈরি করে।

এটি পারফরম্যান্সের জন্য গুরুত্বপূর্ণ হতে পারে - একটি ক্রিয়া দ্রুত হয়, যেহেতু এটি হয় না fork()এবং exec()। সাধারণ পরিস্থিতিতে, পার্থক্যটি তুচ্ছ, তবে আপনি যদি এমন কোনও সিস্টেম ডিবাগ করছেন যা স্মৃতিশক্তি থেকে দূরে রয়েছে এবং পৃষ্ঠা-থ্র্যাশিং করছে, তবে এটি একটি বড় পার্থক্য করতে পারে।

এছাড়াও, আপনি যদি আপনার বর্তমান শেল পরিবেশ পরিবর্তন করতে চান তবে আপনার একটি ফাংশন ব্যবহার করা উচিত। উদাহরণস্বরূপ, একটি ফাংশন $PATHবর্তমান শেলটির জন্য কমান্ড লুপ পরিবর্তন করতে পারে , তবে একটি স্ক্রিপ্ট পারে না, কারণ এটি একটি কাঁটাচামচ / এক্সিকিউটিভ অনুলিপিটিতে কাজ করে $PATH


বাচ্চাদের ফাংশনগুলির এই প্রচার কীভাবে কাজ করে?
হ্যাপিফিডিস

1
@ হ্যাপিফিসি বাশ-এ আপনি export -fকোনও কাজ করতে পারেন , যদিও এর সুনির্দিষ্ট অভ্যন্তরীণ কাজগুলি কিছুটা অস্পষ্ট। আমি বিশ্বাস করি traditionalতিহ্যবাহী বোর্ন শেল এটি পোর্টেবল নয়।
ট্রিপলি

7

স্ক্রিপ্ট এবং ওরফে এবং স্ক্রিপ্ট এবং ফাংশন পারস্পরিক একচেটিয়া নয়। আপনি স্ক্রিপ্টগুলিতে উপকরণ এবং ফাংশন সঞ্চয় করতে এবং করতে পারেন।

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

যেহেতু এলিয়াসগুলি প্যারামিটারাইজড নয় , সেগুলি খুব সীমাবদ্ধ; সাধারণত কিছু ডিফল্ট পরামিতি সংজ্ঞায়িত করতে।

একটি ফাংশনটি কোডের একটি পৃথক ইউনিট , কয়েকটি লাইনের কোডের একটি সু-সংজ্ঞায়িত ধারণা যা ছোট, দরকারী অংশগুলিতে বিভক্ত হতে পারে না; একটি যা সরাসরি বা অন্য কার্যাবলী দ্বারা পুনরায় ব্যবহার করা যেতে পারে।


5

যদি এটি খুব দ্রুত হওয়া উচিত তবে এটিকে একটি উপাধি বা একটি ফাংশন তৈরি করুন।

যদি এটি আপনার পছন্দসই শেলের বাইরে ব্যবহারযোগ্য হয় তবে এটিকে একটি স্ক্রিপ্ট তৈরি করুন। 1

যদি এটি আর্গুমেন্ট নেয় তবে এটিকে একটি ফাংশন বা স্ক্রিপ্ট করুন।

যদি এটিতে বিশেষ অক্ষর থাকতে হয় তবে এটিকে একটি উপন্যাস বা স্ক্রিপ্ট তৈরি করুন। 2

যদি এটি সুডোর সাথে কাজ করার প্রয়োজন হয় তবে এটিকে একটি উপন্যাস বা স্ক্রিপ্ট তৈরি করুন। 3

আপনি যদি লগ আউট এবং ইন না করে সহজেই এটি পরিবর্তন করতে চান তবে স্ক্রিপ্টটি আরও সহজ। 4

পাদটিকা

1 বা এটি একটি উপাধি করুন, এটিকে ~/.envসেট করুন এবং সেট করুন export ENV="$HOME/.env", তবে এটি বহনযোগ্যভাবে কাজ করা জটিল।

2 ফাংশনটির নাম অবশ্যই শনাক্তকারী হতে হবে, সুতরাং সেগুলি অবশ্যই একটি বর্ণ দিয়ে শুরু করা উচিত এবং এতে কেবল অক্ষর, সংখ্যা এবং আন্ডারস্কোর থাকতে পারে। উদাহরণস্বরূপ, আমার একটি উপনাম রয়েছে alias +='pushd +1'। এটি কোনও ফাংশন হতে পারে না।

3 এবং উপনাম যুক্ত করুন alias sudo='sudo '। পূর্বোক্ত অন্য কোন কমান্ড যেমন strace, gdbইত্যাদি যে তার প্রথম আর্গুমেন্ট হিসাবে কমান্ড লাগে।

4 আরও দেখুন: fpath। অবশ্যই আপনিও করতে পারেন source ~/.bashrcবা অনুরূপ, তবে এর প্রায়শই অন্যান্য পার্শ্ব প্রতিক্রিয়া দেখা দেয়।


1
আমি জানতাম না যে আপনি +বাশে উরফ করতে পারবেন । মজার বিষয় হল, পরীক্ষার পরে আমি আবিষ্কার করেছিলাম যে ব্যাশে আপনি +একটি উপনাম তৈরি করতে পারেন তবে কোনও ফাংশন নয়, যেমন আপনি বলেছেন, তবে zsh এর বিপরীত - +কোনও ফাংশন হতে পারে তবে একটি উপনাম নয়।
কেভিন

ইন zshআপনি লিখতে আছে alias -- +='some command here'
মাইকেল

একরকম, আমি মনে করি না যে এলিয়াসিং +পোর্টেবল is দেখুন ওরফে নামের উপর POSIX বৈশিষ্ট
jw013

3
ব্যবহার আবরণ জন্য upvote sudo। পাদটীকা 4 সম্পর্কিত, আমি আমার উপনামগুলি ~/.bash_aliasesএবং ফাংশন সংজ্ঞাগুলিতে সংরক্ষণ করি ~/.bash_functionsযাতে আমি সহজেই sourceসেগুলি পুনরায় করতে পারি (পার্শ্ব প্রতিক্রিয়াগুলির কোনও আশঙ্কা ছাড়াই)।
অ্যান্টনি জিওঘেগেন

3

কেবল কয়েকটি নোট যুক্ত করতে:

  • সুডোর সাথে শুধুমাত্র পৃথক স্ক্রিপ্ট ব্যবহার করা যেতে পারে (যেমন আপনার যদি কোনও সিস্টেম ফাইল সম্পাদনা করার প্রয়োজন হয়) যেমন:
sudo v /etc/rc.conf  #where v runs vim in a new terminal window;
  • কেবলমাত্র এলিয়াস বা ফাংশনগুলি একই নামের অধীনে সিস্টেম কমান্ডগুলি প্রতিস্থাপন করতে পারে (ধরে নিই যে আপনি আপনার স্ক্রিপ্টগুলি প্যাথের শেষের দিকে যুক্ত করেছেন, আমি মনে করি যে সিস্টেম কমান্ডের সাথে একই নামের সাথে দুর্ঘটনাজনিত বা লিপিবদ্ধভাবে স্ক্রিপ্ট তৈরির ক্ষেত্রে সুরক্ষার জন্য পরামর্শ দেওয়া হয়েছে), উদাহরণ স্বরূপ:
alias ls='ls --color=auto'  #enable colored output;
  • উপকরণ এবং ফাংশনগুলি কার্যকর করার জন্য কম মেমরি এবং সময় নেয় তবে লোড করতে সময় নেয় (যেহেতু শেল আপনাকে প্রম্পট দেখানোর আগে সেগুলির সমস্ত ব্যাখ্যা করতে হবে)। আপনি যদি নিয়মিত নতুন শেল প্রক্রিয়া চালান তবে এটিকে অ্যাকাউন্টে নিন Take
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.

এগুলি ছাড়া, আপনি সম্ভাব্যতম সহজতম ফর্মটি ব্যবহার করতে পারেন, অর্থাত্ প্রথমে ওরফে বিবেচনা করুন, তারপরে ফাংশন করুন, তারপরে স্ক্রিপ্টটি।


5
উপকরণগুলিও ব্যবহার করা যেতে পারে sudo। তবে প্রথমে আপনার দরকার আছে alias sudo='sudo '
মাইকেল

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

2

আমার থাম্বের নিয়মটি হ'ল:

  • এলিয়াস - একটি কমান্ড, কোনও পরামিতি নেই
  • ফাংশন - একটি কমান্ড কিছু পরামিতি
  • স্ক্রিপ্ট - বিভিন্ন কমান্ড, কোন পরামিতি

1

একাধিক ব্যবহারকারীর (বা মাল্টি সিসামিন) পরিবেশে, আমি সমস্ত কিছুর জন্য স্ক্রিপ্ট ব্যবহার করি, এমনকি যদি এটি একটি সংক্ষিপ্ত 'এক্সেক কিছু ....' র‍্যাপার হিসাবে শেষ হয়।

অবশ্যই, এটি একটি উপন্যাস বা ফাংশনটির তুলনায় প্রযুক্তিগতভাবে ধীর / কম দক্ষ তবে এটি প্রায়শই বিবেচ্য নয় - এবং এটি যদি পথে থাকে তবে একটি স্ক্রিপ্ট সর্বদা কাজ করে।

আপনার বৈশিষ্ট্যটি ক্রোন থেকে ডাকা হতে পারে, হ্রাস বা পরিবর্তিত পরিবেশের সাথে সুডো বা এনভির মতো কোনও কিছু থেকে, অথবা ব্যবহারকারী আপনাকে কেবল একটি আলাদা শেল ব্যবহার করতে পারে - সমস্ত বা যা কোনও উপাধ বা ফাংশন ভেঙে যাওয়ার সম্ভাবনা রয়েছে।

আপনার যদি কিছু সংবেদনশীল পারফরম্যান্স থাকে তবে এটিকে বিশেষ কেস হিসাবে হ্যান্ডেল করুন বা আরও ভাল, বিবেচনা করুন যে আরও কার্যকরী স্ক্রিপ্টিং ভাষায় পুনরায় লেখার ট্রিগার।

যদি আমরা এমন বৈশিষ্ট্যগুলির বিষয়ে কথা বলি যা কেবলমাত্র অন্যান্য স্ক্রিপ্টগুলিতে ব্যবহৃত হবে, তবে আপনি একটি আদর্শ শেল সংজ্ঞায়িত করতে এবং একটি ফাংশন লাইব্রেরি স্ক্রিপ্ট লিখতেও বিবেচনা করতে পারেন যা স্রেফ হতে পারে। আমি অন্যান্য সমস্ত স্ক্রিপ্টগুলিতে টানলাম।

টি


0

পরিস্থিতির জন্য একটি উদাহরণ যেখানে আপনি সম্ভবত একটি এলিয়াস ব্যবহার করতে চান।

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

আমার কাছে একটি স্ক্রিপ্ট রয়েছে ~/.bin/যা setupনিম্নলিখিতটি করে: 1

  1. আমাকে একটি নির্দিষ্ট ডিরেক্টরিতে নিয়ে আসে।
  2. কয়েকটি ভেরিয়েবলের সংজ্ঞা দেয়।
  3. ডিরেক্টরিটির অবস্থা সম্পর্কে বার্তা মুদ্রণ করে। 2

মুল বক্তব্যটি হ'ল যদি আমি কেবল চালিত setup <project-name>করি তবে আমার সেই ভেরিয়েবলগুলি সংজ্ঞায়িত হবে না এবং আমি ডিরেক্টরিতে মোটেও উঠতে পারতাম না। সমাধান আমি ভাল হতে পাওয়া এই স্ক্রিপ্টের যোগ করার জন্য ছিল PATHযোগ alias setup=". ~/.bin/setup"করতে ~/.bashrcবা যাই হোক না কেন।

নোট:

  1. আমি এই কাজের জন্য একটি স্ক্রিপ্ট ব্যবহার করেছি এবং একটি ক্রিয়াকলাপের জন্য নয় কারণ এটি বিশেষত দীর্ঘ নয় কারণ আমি এটি সম্পাদনা করতে পারি এবং যদি আমি এটির ব্যবহারটি রিফ্রেশ করতে চাই তবে সম্পাদনার পরে ফাইলটি উত্স করতে হবে না।
  2. আমার সমস্ত ডটফাইলগুলি পুনরায় লোড করার জন্য একটি স্ক্রিপ্ট তৈরি করার সময় আমার কাছে অনুরূপ ঘটনা ঘটেছে। 3
  1. স্ক্রিপ্ট পাওয়া যায় আমার dotfiles সংগ্রহস্থলের অধীনে .bin/
  2. স্ক্রিপ্ট সম্পর্কে : আমি এই স্ক্রিপ্টটিকে একটি যুক্তি দিচ্ছি যা আমি অগ্রিম সংজ্ঞায়িত প্রকল্পের একটি নাম। এরপরে স্ক্রিপ্টটি নির্দিষ্ট csvফাইল অনুযায়ী সঠিক ডিরেক্টরিতে আমার কাছে আনতে জানে । এটির পরিবর্তিত পরিবর্তনশীলগুলি সেই ডিরেক্টরিটির মেকফাইল থেকে নেওয়া হয়। এরপরে স্ক্রিপ্টটি চলে ls -lএবং git statusসেখানে কী চলছে তা আমাকে দেখানোর জন্য।
  3. সেই স্ক্রিপ্টটি আমার ডটফিলস ভাণ্ডারগুলিতেও উপলব্ধ .bin/

1
এইচ এম, মনে হচ্ছে এটি কেবল একটি ফাংশন হওয়া উচিত, কোনও উপ-স্ক্রিপ্ট সংমিশ্রণ নয়। (বিটিডাব্লু, পরিবেশের বানান "পরিবেশ" "অনুভূতি নয়" not)
ওয়াইল্ডকার্ড

টাইপো সম্পর্কে মন্তব্য করার জন্য ধন্যবাদ, আমি এটি পরবর্তী প্রতিশ্রুতিতে ঠিক করব। কোনও স্ক্রিপ্টের পরিবর্তে কোনও ফাংশন ব্যবহার করার ক্ষেত্রে - সম্ভবত আমি এই নির্দিষ্ট টাস্কের জন্য কোনও ফাংশন ব্যবহার করব এবং এই উপকরণগুলি ফেলে দেব। মুল বক্তব্যটি হ'ল মাঝেমধ্যে আপনি যদি স্ক্রিপ্টটি সময়ে সময়ে সম্পাদনা করেন তবে স্ক্রিপ্ট এবং একটি উপনাম ব্যবহার করা বেশ সহজ ।
ডোরন বেহার

0

কখন স্ক্রিপ্ট লিখব

যখন আপনি শেল ছাড়া অন্য কোনও সরঞ্জাম থেকে কমান্ডটি চালাতে চাইতে পারেন।

এর মধ্যে ভিম (আমার জন্য) অন্তর্ভুক্ত রয়েছে: লিখিত ফিল্টার এবং অন্যান্য প্রোগ্রামগুলি স্ক্রিপ্ট হিসাবে থাকা, আমি :%!my-filterআমার সম্পাদক থেকে প্রোগ্রামের মাধ্যমে কোনও ফাইল ফিল্টার করার মতো কিছু করতে পারি ।

যদি my-filterকোনও ফাংশন বা ওরফে থাকতেন তবে তা সম্ভব হত না।

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