বাশ এবং শেল স্ক্রিপ্ট পরিবর্তনশীল মূলধন সঠিক করুন


192

আমি সমস্ত ক্যাপগুলিতে ভেরিয়েবলগুলি সহ অনেকগুলি শেল স্ক্রিপ্টগুলিতে চালিত করি এবং আমি সর্বদা ভেবেছিলাম যে এটির সাথে একটি গুরুতর ভুল বোঝাবুঝি রয়েছে। আমার বোঝাটি হ'ল, কনভেনশন অনুসারে (এবং সম্ভবত অনেক আগে প্রয়োজনের দ্বারা) পরিবেশের পরিবর্তনগুলি সমস্ত ক্যাপগুলিতে রয়েছে।

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

#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"

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

উত্তর:


262

প্রচলিত রীতি অনুযায়ী, বিভিন্ন পরিবেশের (কসম PAGER, EDITOR, ...) এবং অভ্যন্তরীণ শেল ভেরিয়েবল ( SHELL, BASH_VERSION, ...) মূলধন হয়। অন্যান্য সমস্ত ভেরিয়েবলের নামগুলি ছোট হাতের হওয়া উচিত।

মনে রাখবেন যে পরিবর্তনশীল নামগুলি কেস-সংবেদনশীল; এই কনভেনশনটি দুর্ঘটনাক্রমে পরিবেশগত এবং অভ্যন্তরীণ ভেরিয়েবলগুলি অগ্রাহ্য করে।

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


8
+1 টি। দুর্ঘটনাক্রমে ওভাররাইটিং সম্পর্কে ভাল পয়েন্ট। আমি উল্লেখ করতে ভুলে গিয়েছিলাম, তবে এখন আপনি এটি উল্লেখ করেছেন বলে আমি মনে করি আমি ছোট হাতের ব্যবহার করার সিদ্ধান্ত নিয়েছিলাম কারণ আমি কেবল সেই সমস্যাটি পড়েছি বা শুনেছি।
জেসনস্মিথ

5
আমি ভেবেছিলাম বড় হাতের পরিবর্তনশীল নাম ব্যবহারের মূল কারণ হ'ল শেল কমান্ডগুলির সাথে বিরোধগুলি এড়ানো। আমাদের সম্প্রতি একটি সার্ভারের হোস্টনামটি দুর্ঘটনাক্রমে '=' এ পরিবর্তিত হয়েছে কারণ স্ক্রিপ্টে একটি ভেরিয়েবল 'হোস্টনাম' ব্যবহার করা হয়েছিল।
এইসুইটসআইবলাকনট

25
@ThisSuitIsBlackNot ক্রেইপ কোড উপেক্ষা করে, ভেরিয়েবলগুলি ডলারের সাথে উপস্থাপিত হয় যখন প্রসারিত হয় এবং এমন জায়গায় ব্যবহার করা হয় যেখানে তারা না থাকলে কমান্ডের নাম দিয়ে বিভ্রান্ত করা যায় না। স্পষ্টতই, হোস্টনাম = মূ করা আপনার অসুবিধা হতে চলেছে। আপনি নিম্ন-স্তরের "হোস্টনেম" ব্যবহার করছেন না এর কারণে নয়, আপনি সঠিক অ্যাসাইনমেন্ট সিনট্যাক্স ব্যবহার করছেন না বলে। অ্যাসাইনমেন্টটি হোস্টনাম = মু, কোনও স্পেস ছাড়াই সম্পন্ন হয়। সঠিক কোড ধরে নিলে, আপনাকে ভেরিয়েবলের নাম কমান্ডের নামগুলির সাথে দ্বন্দ্ব করতে হবে না।
lhunath

3
আমি সমস্ত পাঠ্য পুস্তকগুলিতে সর্বদা সমস্ত শেল ভেরিয়েবলের জন্য ব্যবহারকারীর বড় হাতের অক্ষর দেখেছি। যখন লোয়ার কেস ভেরিয়েবলের নাম অনুমোদিত, তবে বড় হাতের কনভেনশন।
ব্রায়ান এস উইলসন

3
আমি এটি জানতাম না, এবং আমি মাত্র কয়েক ঘন্টা হারিয়েছি lost এর USER="username"পরিবর্তে ssh এর মাধ্যমে কিছু দূরবর্তী কমান্ড স্বয়ংক্রিয় করে ব্যাশ স্ক্রিপ্টে ব্যবহার করা হবে user="username"। ইসস! খুশী আমি এখন জানি!
গ্যাব্রিয়েল স্ট্যাপলস

28

ধারাবাহিকভাবে অনুসরণ করা কোনও নামকরণ কনভেনশন সর্বদা সহায়তা করবে। শেল ভেরিয়েবল নামকরণের জন্য এখানে কয়েকটি সহায়ক টিপস রয়েছে:

  • ব্যবহার করুন সব ক্যাপ এবং আন্ডারস্কোর রপ্তানি ভেরিয়েবল এবং ধ্রুবক জন্য, বিশেষ করে যখন তারা একাধিক স্ক্রিপ্ট বা প্রসেস জুড়ে ভাগ করা হয়েছে। যখনই প্রযোজ্য তখন একটি সাধারণ উপসর্গ ব্যবহার করুন যাতে সম্পর্কিত ভেরিয়েবলগুলি বাইরে যায় এবং বাশের অভ্যন্তরীণ ভেরিয়েবলগুলির সাথে সংঘর্ষ না ঘটে যা সমস্ত বড় ক্ষেত্রে রয়েছে।

    উদাহরণ:

    • সাধারণ উপসর্গ সহ রফতানি চলক: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • ধ্রুবক: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • একক স্ক্রিপ্ট বা একটি ব্লকে স্কোপযুক্ত সমস্ত ভেরিয়েবলের জন্য "স্নেক কেস" ( সমস্ত ছোট এবং আন্ডারস্কোর ) ব্যবহার করুন।

    উদাহরণ: input_file first_value max_amount num_errors

    যখন স্থানীয় ভেরিয়েবলের সাথে পরিবেশের ভেরিয়েবলের কিছু সম্পর্ক থাকে তবে মিশ্র কেস ব্যবহার করুন: old_IFS old_HOME

  • "ব্যক্তিগত" ভেরিয়েবল এবং ফাংশনের জন্য একটি শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করুন। এটি বিশেষত প্রাসঙ্গিক যদি আপনি কখনই শেল লাইব্রেরি লিখেন যেখানে কোনও লাইব্রেরি ফাইলের মধ্যে বা ফাইলগুলির জুড়ে ফাংশনগুলিকে ভেরিয়েবলগুলি ভাগ করে নেওয়া দরকার হয়, মূল কোডটিতে একইভাবে নামকরণ হওয়া কোনও কিছুর সাথে সংঘর্ষ না করে।

    উদাহরণ: _debug _debug_level _current_log_file

  • উটের মামলা এড়িয়ে চলুন । এটি কেস টাইপসের কারণে বাগগুলি কমিয়ে আনবে। মনে রাখবেন, শেল ভেরিয়েবলগুলি কেস সংবেদনশীল

    উদাহরণ: inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


আরো দেখুন:


1
এটি একটি সম্মেলন তবে এটি সর্বজনীনভাবে স্বীকৃত নয়। উটের মামলার বিরুদ্ধে যুক্তি পুরোপুরি বিশ্বাসযোগ্য নয়। রফতানি ভেরিয়েবলের জন্য SHOUTING ব্যবহারের পরামর্শটি হালকা বিতর্কিত।
ট্রিপলি

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

8

যদি শেল ভেরিয়েবলগুলি পরিবেশে রফতানি হতে চলেছে, তবে এটি পসিক্স (ইস্যু 7, 2018 সংস্করণ) পরিবেশের পরিবর্তনশীল সংজ্ঞা নির্দিষ্ট করে:

POSIX.1-2017 এর শেল এবং ইউটিলিটিস ভলিউমে ইউটিলিটিগুলির দ্বারা ব্যবহৃত পরিবেশগত পরিবর্তনশীল নামগুলি কেবল _পোর্টেবল ক্যারেক্টার সেটে বর্ণিত অক্ষরগুলি থেকে বড় হাতের অক্ষর, অঙ্কগুলি এবং আন্ডারস্কোর ( ) দ্বারা গঠিত হয় এবং কোনও অঙ্ক দিয়ে শুরু হয় না।

...

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


6

আপনি যা করেন আমি তা করি। আমি সন্দেহ করি যে একটি প্রামাণিক উত্স আছে, তবে এটি বেশ বিস্তৃত ডি-ফ্যাক্টো স্ট্যান্ডার্ড বলে মনে হচ্ছে।


1
আমি রাজী. এর কারণ ALL_CAPS কুরুচিপূর্ণ, তবে পরিবেশের বিভিন্নতা কুরুচিপূর্ণ হয়ে দাঁড়িয়ে থাকা ভাল।
পাতলা

1
আমি কোডিং শৈলীতে আপনার সাথে একমত, তবে আমি অবশ্যই এটির যে এটি ব্যাপক! শেল স্ক্রিপ্টগুলি সেই পাশের ভাষাগুলির মধ্যে একটি যা লোকেরা কেবল অনানুষ্ঠানিকভাবে শিখেন এবং তাই আমার মনে হয় সবাই সর্বদা LOCATION = বলছেcat /tmp/location.txt
জেসনস্মিথ

@ জেএএস - আমি যে শেল স্ক্রিপ্টগুলির সাথে কাজ করতে হয়েছিল তাতে আমি অবশ্যই ভাগ্যবান!
ড্রাগন

4
"ছোট হাতের অক্ষরযুক্ত পরিবেশের পরিবর্তনশীল নামের নামের স্থানটি অ্যাপ্লিকেশনের জন্য সংরক্ষিত।" - পসিক্স আইইইই স্ট্যান্ড 1003.1-2008 বিভাগ 8.1
ট্রিপল ডিসি

5

আসলে, "পরিবেশের ভেরিয়েবল" শব্দটি বেশ সাম্প্রতিক মুদ্রার বলে মনে হচ্ছে। কার্নিগান এবং পাইক ১৯ 1984৪ সালে প্রকাশিত তাদের ক্লাসিক বই "দ্য ইউনিক্স প্রোগ্রামিং এনভায়রনমেন্ট" -তে কেবল "শেল ভেরিয়েবল" নিয়ে কথা বলেন - সূচকে "পরিবেশ" এর জন্য এমনকি কোনও প্রবেশিকাও নেই!


8
আমি মনে করি এটি বইয়ের একটি বাদ। গেটেনভ (), সেটেনভ () এবং পরিবেশ ইউনিক্স সংস্করণ 7 (1979) এ প্রবর্তিত হয়েছিল। en.wikedia.org/wiki/Version_7_Unix
জুলিয়ানো

3
এই বইটি লক্ষ্য করে দেখায় যে আপার কেস ভেরিয়েবলগুলির বিশেষ অর্থ রয়েছে।
আশাবলি

3

এটি কেবলমাত্র একটি বহুল প্রচারিত সম্মেলন, আমি সন্দেহ করি এর জন্য কোনও "প্রামাণিক" উত্স আছে।


1

আমি পরিবেশ এবং বৈশ্বিক ভেরিয়েবল উভয়ের জন্য ALL_CAPS ব্যবহার করি। অবশ্যই, বাশে কোনও আসল পরিবর্তনশীল সুযোগ নেই, সুতরাং গ্লোবাল (বেশিরভাগ সেটিংস এবং রাষ্ট্রীয় ট্র্যাকিং) হিসাবে ব্যবহারযোগ্য ভেরিয়েবলগুলির একটি ভাল অংশ রয়েছে এবং তুলনামূলকভাবে কয়েকটি 'স্থানীয়' (কাউন্টার, পুনরায়, আংশিকভাবে নির্মিত স্ট্রিং এবং অস্থায়ী)


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