Vari 0 এবং $ 1 শেল / এনভায়রনমেন্ট ভেরিয়েবলের মতো ভেরিয়েবলগুলি কি?


17

সেখানে শেল মত ভেরিয়েবল $0, $1, $2, $?, ইত্যাদি

আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে শেল এবং পরিবেশের ভেরিয়েবলগুলি মুদ্রণের চেষ্টা করেছি:

set

তবে এই ভেরিয়েবলগুলি তালিকায় ছিল না।

সুতরাং মূলত এই ভেরিয়েবলগুলি শেল / পরিবেশের ভেরিয়েবল হিসাবে বিবেচিত হয় না, তাই না? (এগুলি আউটপুট দেওয়ার পরেও, আপনি এগুলি $শেল / এনভায়রনমেন্ট ভেরিয়েবলের মতো করে তাদের আগে চলে যেতে হবে)


3
অবস্থানগত পরামিতিগুলি ভেরিয়েবল নয়। আপনি পরিবেশের পরিবর্তনশীলে export 3পরিণত করতে পারবেন না $3। আপনি পারবেন না unset 3; এবং আপনি $3ব্যবহার করে একটি নতুন মান নির্ধারণ করতে পারবেন না 3=val
কাজ

উত্তর:


25

ভেরিয়েবলগুলি শেলের তিনটি পৃথক প্রকারের প্যারামিটারগুলির মধ্যে একটি।

  1. একটি ভেরিয়েবল এমন একটি প্যারামিটার যার নাম বৈধ শেল সনাক্তকারী; শুরু হয় _বা একটি চিঠি দিয়ে, তারপরে শূন্য বা আরও বেশি অক্ষর, সংখ্যা বা _
  2. অবস্থানগত পরামিতি সংখ্যাযুক্ত পরামিতি হয় $1, $2...
  3. বিশেষ পরামিতি সব একক চরিত্রের নাম আছে, এবং থেকে সরাইয়া $0, সব তারা বিভিন্ন যতিচিহ্ন অক্ষর।

set কেবল শেলের ভেরিয়েবলগুলি প্রদর্শন করে।

শেল ভেরিয়েবলের একটি উপসেট হ'ল এনভায়রনমেন্ট ভেরিয়েবল, যার মানগুলি হয় শেল শুরু হওয়ার সাথে সাথে পরিবেশ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় অথবা exportএকটি বৈধ নামের সাথে অ্যাট্রিবিউট সেট করে তৈরি করা হয় ।


1
নোট করুন যে setসমস্ত প্যারামিটারগুলি zsh($ 1, $ 2 ... তবে $ *, $ @) এবং ব্যাশ এবং বোশের ফাংশনগুলি প্রদর্শন করে। কিছু শেল যেমন ksh93 এবং ড্যাশ আউটপুট এনভি ভার্সের পুরানো সংস্করণগুলি যা শেল ভেরিয়েবলগুলিতে ম্যাপ করা হয়নি। ( env 1=foo ksh -c setমুদ্রণ করা হবে 1=foo)
স্টাফেন চ্যাজেলাস

11

পরিবেশগত পরিবর্তনসমূহ বনাম অবস্থানগত পরামিতি

$INTEGERভেরিয়েবলের ধরণের বিষয়ে আলোচনা শুরু করার আগে আমাদের বুঝতে হবে সেগুলি আসলে কী এবং কীভাবে তারা পরিবেশের ভেরিয়েবল থেকে পৃথক V ভেরিয়েবলগুলি যেমন $INTEGERঅবস্থানিক পরামিতি বলে। এটি POSIX (পোর্টেবল অপারেটিং সিস্টেম ইন্টারফেস) স্ট্যান্ডার্ড, বিভাগ 2.1 (জোর দিয়ে খনি) - এ বর্ণনা করা হয়েছে:

  1. শেলটি একটি ফাংশন সম্পাদন করে (ফাংশন সংজ্ঞা কমান্ড দেখুন), অন্তর্নির্মিত (বিশেষ বিল্ট-ইন ইউটিলিটিগুলি দেখুন), এক্সিকিউটেবল ফাইল, বা স্ক্রিপ্ট, আর্গুমেন্টের নাম দিয়ে 1 থেকে n নম্বরযুক্ত পজিশনাল প্যারামিটার হিসাবে এবং কমান্ডের নাম (অথবা কোনও স্ক্রিপ্টের মধ্যে কোনও ক্রিয়াকলাপের ক্ষেত্রে, স্ক্রিপ্টের নাম) সংখ্যাযুক্ত 0 হিসাবে প্যারামিটার হিসাবে চিহ্নিত হয় (কমান্ড অনুসন্ধান এবং সম্পাদন দেখুন)।

বিপরীতে, যেমন ভেরিয়েবল $HOMEএবং $PATHবিভিন্ন পরিবেশের হয়। তাদের সংজ্ঞাটি স্ট্যান্ডার্ডের 8 অনুচ্ছেদে বর্ণিত হয়েছে :

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

তাদের বিবরণ লক্ষ্য করুন। অবস্থানগত পরামিতি বলতে একটি কমান্ডের সামনে উপস্থিত হওয়া বোঝায়, অর্থাত্‍ command positional_arg_1 positional_arg_2...। এগুলি ব্যবহারকারীর দ্বারা বিশেষত কী করা উচিত তা কমান্ডটি জানাতে সরবরাহ করা হয়েছিল। আপনি যখন করবেন echo 'Hello' 'World', এটি স্ট্রিংগুলি Helloএবং Worldমুদ্রণগুলি প্রিন্ট করবে , কারণ এগুলি হল অবস্থানগত পরামিতি echo- আপনি যে জিনিসগুলিতে echoপরিচালনা করতে চান । এবং echoএটি এমনভাবে তৈরি করা হয়েছে যে এটি অবস্থানীয় পরামিতিগুলি স্ট্রিংগুলি মুদ্রণের জন্য হিসাবে বোঝে (যদি না তারা পছন্দসই পতাকাগুলির মধ্যে না হয় -n)। আপনি যদি আলাদা কমান্ড দিয়ে এটি করেন তবে এটি কী Helloএবং কী তা বুঝতে পারে নাWorldসম্ভবত এটি একটি সংখ্যা প্রত্যাশা কারণ। লক্ষ্য করুন যে অবস্থানগত পরামিতিগুলি "উত্তরাধিকার সূত্রে প্রাপ্ত নয়" - কোনও শিশু প্রক্রিয়া সুস্পষ্টভাবে শিশু প্রক্রিয়াতে না পৌঁছে দেওয়া পর্যন্ত পিতামাতার অবস্থানগত পরামিতিগুলি সম্পর্কে জানে না। প্রায়শই আপনি দেখেন যে মোড়ক স্ক্রিপ্টগুলির সাথে অবস্থানগত পরামিতিগুলি পাস করা হচ্ছে - এটি সম্ভবত কমান্ডের ইতিমধ্যে বিদ্যমান উদাহরণের জন্য যাচাই করে বা রিয়েল কমান্ডে অতিরিক্ত অবস্থানিক পরামিতি যুক্ত করে।

বিপরীতে, পরিবেশের ভেরিয়েবলগুলি একাধিক প্রোগ্রামকে প্রভাবিত করতে বোঝায়। এগুলি পরিবেশের ভেরিয়েবল, কারণ এগুলি প্রোগ্রামের বাইরেই সেট করা আছে (এর নীচে আরও)। নির্দিষ্ট পরিবেশের ভেরিয়েবল যেমন নির্দিষ্ট ফর্ম্যাট HOMEবা PATHনির্দিষ্ট অর্থ রয়েছে এবং সেগুলি প্রতিটি প্রোগ্রামের জন্য একই রকম হবে। HOMEভেরিয়েবলের অর্থ বাহ্যিক ইউটিলিটি /usr/bin/findবা আপনার শেলের মতোই হবে (এবং ফলস্বরূপ কোনও স্ক্রিপ্টে) - এটি ব্যবহারকারীর নামের হোম ডিরেক্টরি যা অধীনে প্রক্রিয়া চালিত হয়। লক্ষ্য করুন যে পরিবেশগত ভেরিয়েবলগুলি নির্দিষ্ট কমান্ড আচরণের জন্য অ্যাকাউন্টে ব্যবহৃত হতে পারে, উদাহরণস্বরূপUIDএনভায়রনমেন্ট ভেরিয়েবলটি স্ক্রিপ্টটি মূল সুবিধার সাথে চালিত হয় কিনা তা পরীক্ষা করে ব্যবহার করা যেতে পারে এবং তদনুসারে নির্দিষ্ট ক্রিয়াতে শাখা করা যেতে পারে। পরিবেশের পরিবর্তনগুলি উত্তরাধিকারসূত্রে হয় - শিশু প্রক্রিয়াগুলি পিতামাতার পরিবেশনের অনুলিপি পায়। আরও দেখুন যদি প্রক্রিয়াগুলি পিতামাতার পরিবেশের উত্তরাধিকারী হয় তবে কেন আমাদের রফতানি দরকার?

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


শুধু শেল ধারণা নয়

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

এটি একটি গুরুত্বপূর্ণ পার্থক্য, তবে এটিও গুরুত্বপূর্ণ যে টার্মিনালটি একটি প্রোগ্রাম এবং তাই পরিবেশ এবং অবস্থানগত পরামিতিগুলির একই নিয়ম মেনে চলে। তোমার gnome-terminalযখন শুরু আপনার তাকান হবে SHELLএনভায়রনমেন্ট ভেরিয়েবল, এবং যদি না আপনার সাথে কিছু অন্যান্য কমান্ড উল্লেখ, আপনার জন্য উপযুক্ত ডিফল্ট শেল ডিম -e। ধরা যাক আমি আমার ডিফল্ট শেলটি এতে পরিবর্তন করেছি ksh - জিনোম-টার্মিনাল এর kshপরিবর্তে স্পোন হবে bash। প্রোগ্রামগুলি দ্বারা পরিবেশ কীভাবে ব্যবহৃত হয় তারও এটি একটি উদাহরণ। যদি আমি স্পষ্টভাবে বলতে gnome-terminalসঙ্গে -eনির্দিষ্ট শেল চালানোর জন্য - এটা এটা করতে হবে, কিন্তু এটা স্থায়ী হবে না। বিপরীতে, পরিবেশ বলতে বোঝানো হয় বেশিরভাগই অপরিবর্তিত (আরও পরে এটি)।

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

int main(int argc, char **argv)

, যেখানে argcকমান্ড-লাইন আর্গুমেন্টের সংখ্যা রয়েছে এবং argvকার্যকরভাবে কমান্ড-লাইন প্যারামিটারের অ্যারে রয়েছে, এবং তারপরে ব্যবহারকারীর হোম ডিরেক্টরি পথ, ডিরেক্টরিগুলির তালিকা যেখানে আমরা এক্সিকিউটেবলের সন্ধান করতে পারি ইত্যাদি ইত্যাদির মতো জিনিস অ্যাক্সেস করার জন্য environ(লিনাক্স-এ man -e 7 environ) ফাংশন রয়েছে PATHetc. শেল স্ক্রিপ্টগুলিও একইভাবে মডেল করা হয়। শেল পরিভাষায়, আমরা অবস্থানগত পরামিতি আছে $1, $2এবং তাই ঘোষণা যখন $#অবস্থানগত পরামিতি সংখ্যা। কি হবে $0? এটি নিজেই এক্সিকিউটেবলের নাম, যা আবার সি প্রোগ্রামিং ভাষা থেকেও মডেল করা হয় - argv[0]এটি আপনার সি এর "এক্সিকিউটেবল" নাম হবে। এবং বেশিরভাগ প্রোগ্রামিং এবং স্ক্রিপ্টিং ভাষার ক্ষেত্রে এটি মোটামুটি সত্য ।

ইন্টারেক্টিভ বনাম অ-ইন্টারেক্টিভ শেল

ইতিমধ্যে আমি যে জিনিসগুলি ইঙ্গিত করেছি তার মধ্যে একটি হল ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ শেলের মধ্যে পার্থক্য । প্রম্পট যেখানে আপনি কমান্ড টাইপ করেন - এটি ইন্টারেক্টিভ, এটি ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে। বিপরীতে যখন আপনার শেল স্ক্রিপ্ট থাকে বা আপনি bash -c''অ-ইন্টারেক্টিভ চালিত হন ।

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

বিপরীতে, স্ক্রিপ্ট এবং শেলগুলি -cবিকল্পের সাথে চালু হয়েছে $1এবং $2যুক্তিগুলির সুবিধা নিতে পারে। এই ক্ষেত্রে,

$ bash -c 'echo $1; stat $2' sh 'Hello World' /etc/passwd
Hello World
  File: '/etc/passwd'
  Size: 2913        Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 6035604     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-08-12 14:48:37.125879962 -0600
Modify: 2017-08-12 14:48:37.125879962 -0600
Change: 2017-08-12 14:48:37.137879811 -0600
 Birth: -

লক্ষ্য করুন যে আমি সেখানেও ব্যবহার করেছি sh, কারণ ছোট ছোট -cবিকল্পের বিকল্পটি হ'ল প্রথম অবস্থানগত পরামিতি গ্রহণ এবং এটিকে কার্যনির্বাহিত করা $0, সাধারণত প্রোগ্রামটির নাম না হয়ে।

আরেকটি বিষয় যা লক্ষ্য করা গুরুত্বপূর্ণ তা হল অবস্থানগত পরামিতিগুলি হ'ল আমি "ফ্রেমযোগ্য" call কীভাবে দেখুন, আমরা প্রথমে bashতার নিজস্ব অবস্থানগত পরামিতিগুলি দিয়ে চালু করেছি তবে those অবস্থানিক পরামিতিগুলি echoএবং পরামিতি হয়ে গেছে stat। এবং প্রতিটি প্রোগ্রাম এটি নিজস্ব উপায়ে বোঝে। যদি আমরা statকোনও স্ট্রিং দিয়েছি Hello Worldএবং কোনও ফাইল নেই তবে Hello Worldএটির একটি ত্রুটি ঘটবে; bashএটিকে কেবল একটি সরল স্ট্রিং হিসাবে বিবেচনা করে তবে statসেই স্ট্রিংটি একটি বিদ্যমান ফাইলের নাম হিসাবে প্রত্যাশা করে। বিপরীতে, সমস্ত প্রোগ্রাম সম্মত হবে যে পরিবেশের পরিবর্তনশীল HOMEএকটি ডিরেক্টরি (যদি না প্রোগ্রামার এটি অযৌক্তিক উপায়ে কোড করে না)।


পরিবেশের ভেরিয়েবল এবং অবস্থানগত পরামিতিগুলি নিয়ে আমরা কী গোলযোগ করতে পারি?

প্রযুক্তিগতভাবে, আমরা উভয়কে নিয়েই গোলযোগ করতে পারি, তবে পরিবেশের পরিবর্তনশীলগুলির সাথে আমাদের গণ্ডগোল করা উচিত নয় , যখন আমাদের প্রায়শই অবস্থানগত পরামিতি সরবরাহ করতে হয়। আমরা ভেরিয়েবলের প্রিন্টিং সহ শেল কমান্ড চালাতে পারি:

$ hello=world bash -c 'echo $hello'
world

আমরা export variable=valueশেল বা স্ক্রিপ্টের মধ্যে থেকে কেবল পরিবেশে ভেরিয়েবলগুলি রাখতে পারি । অথবা আমরা সম্পূর্ণ খালি পরিবেশ সহ একটি কমান্ড চালাতে পারি env -c command arg1 arg2। তবে সাধারণত পরিবেশের সাথে গোলমাল করার পরামর্শ দেওয়া হয় না, বিশেষত আপার কেস ভেরিয়েবলগুলি ব্যবহার করা বা ইতিমধ্যে বিদ্যমান পরিবেশের ভেরিয়েবলগুলি ওভাররাইট করা। লক্ষ্য করুন যে প্রস্তাবিত যদিও মানক নয়।

অবস্থানগত পরামিতিগুলির জন্য, তাদের সেট করার উপায়টি সুস্পষ্ট, কেবল তাদের কমান্ডে প্রিপেন্ড করুন, তবে এগুলি অন্যান্য বুদ্ধিমান সেট করার পাশাপাশি shiftকমান্ডের মাধ্যমে para পরামিতিগুলির তালিকা পরিবর্তন করার উপায় রয়েছে ।

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


সেট কমান্ড নোট

setকমান্ড, তাই মত ম্যানুয়াল আচরণ করবে অনুযায়ী (ব্যাশ ম্যানুয়াল থেকে জোর যোগ):

বিকল্পগুলি ছাড়াই, প্রতিটি শেল ভেরিয়েবলের নাম এবং মান একটি ফর্ম্যাটে প্রদর্শিত হয় যা বর্তমানে-সেট ভেরিয়েবলগুলি সেট বা পুনরায় সেট করার জন্য ইনপুট হিসাবে পুনরায় ব্যবহার করা যেতে পারে।

অন্য কথায় setশেলের জন্য নির্দিষ্ট ভেরিয়েবলগুলি দেখায়, উদাহরণস্বরূপ কিছু পরিবেশে ঘটে HOME। বিপরীতে কমান্ড দ্বারা লাইক করুন envএবং printenvপ্রকৃত পরিবেশের পরিবর্তনশীল দেখুন যা দিয়ে একটি কমান্ড চালিত হয়। আরও দেখুন এই


"ইন্টারেক্টিভ শেল ইন, আপনি $ 1, $ 2, এবং আরও কিছু উল্লেখ করতে পারবেন না।" এর জন্য প্রত্যক্ষ রেফারেন্স আছে কি? আমি অদ্ভুত ক্ষেত্রে ছড়িয়েছি যেখানে এগুলি একটি ইন্টারেক্টিভ শেল পরিবেশে সেট করা আছে এবং আমি নিশ্চিত নই যে এটি 'অ-মানক' হিসাবে বিবেচিত হবে কিনা।
ব্যবহারকারী5359531

@ user5359531 সত্য, আমি কোথা থেকে এ পেয়েছি তা সম্পর্কে আমি নিশ্চিত নই। সম্ভবত কারণ আমি যখন 2017-এ উত্তর পোস্ট করেছি তখন আমি সম্ভবত উল্লেখ করেছি যে আপনি এর মতো কিছু করতে পারবেন না 1="foo"তবে পরে আমি জানতে পেরেছিলাম যে পসিক্স সংজ্ঞা দ্বারা একটি "শব্দ" (এটি ভেরিয়েবল বা ফাংশনের মতো কোনও জিনিসের নাম) শুরু করতে পারে না একটি অঙ্ক সহ ( আমি বিষয়টিতে পোস্ট করা একটি প্রশ্ন দেখুন )। অবস্থানগত পরামিতি দৃশ্যত এই নিয়মের ব্যতিক্রম।
সের্গেই কলডিয়াজনি

@ user5359531 আমি উত্তরের অংশটি সরিয়েছি, কারণ এটি বিশেষভাবে সঠিক নয়। ইন্টারেক্টিভ শেল এ আপনি উল্লেখ করতে পারেন $1, $2এবং প্রকৃতপক্ষে setকমান্ড দিয়ে কাজটি করা হয়েছে , প্রায়শই /bin/shঅ্যারে না রাখার সীমাবদ্ধতা পেতে । এটি আমার নজরে আনার জন্য ধন্যবাদ। আমি আগামী কয়েকদিনের মধ্যে উত্তরও সম্পাদনা করতে যাচ্ছি, যেহেতু এর জন্য কিছুটা অতিরিক্ত পোলিশ এবং একটি আপডেট দরকার।
সের্গেই কলডিয়াজনি

স্পষ্টির জন্য ধন্যবাদ। সমস্যা আমি হচ্ছে যে সাথে আছেন conda, যখন আপনি চালানোর source conda/bin/activate, এটা কিনা চেক $1, $2ইত্যাদি নির্ধারণ করা হয়, যাতে তা নির্ধারণ করার জন্য আর্গুমেন্ট বা না দিয়ে একটি স্ক্রিপ্ট হিসাবে চালানো হয়। এটি কোনও কারণে ইন্টারেক্টিভ পরিবেশে সেট করা সিস্টেমগুলিতে ব্রেক আপ শেষ করে। আমি ইন্টারেক্টিভ পরিবেশে এই ভেরিয়েবলগুলি সেট করার জন্য সিস্টেমে এই মান-মান-আচরণের কোনও ত্রুটি, বা এটি কোনও স্ক্রিপ্ট হিসাবে চালিত হয়েছে কিনা তা নির্ধারণ করার জন্য প্রোগ্রামে এটি নির্ধারণের জন্য আমি প্রত্যাশা করছি।
ব্যবহারকারী5359531

@ ব্যবহারকারীর 35359531 আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি condaবিকাশকারীদের বা এই জাতীয় স্ক্রিপ্টের মূল লেখক কে বাগ রিপোর্ট দাও , কারণ ${N}প্যারামিটারগুলি পরীক্ষা করা অবশ্যই যাওয়ার ভুল উপায় is এখানে এবং এখানে একই বিষয়ে প্রশ্ন রয়েছে এবং আরও বা কম পোর্টেবল উপায় হ'ল ${0}স্ক্রিপ্টের নাম হিসাবে একই কিনা তা পরীক্ষা করা , যখন bashসেই উদ্দেশ্যে বাস্তবে পরিবেশের পরিবর্তনশীল রয়েছে
সের্গি কলডিয়াজহনি

4

$1, $2, $3, ..., ${10}, ${11}ভেরিয়েবল অবস্থানগত পরামিতি বলা হয় এবং ব্যাশ ম্যানুয়াল বিভাগে আচ্ছাদিত করা হয়3.4.1

3.4.1 অবস্থানগত পরামিতি

অবস্থানগত প্যারামিটারটি একক সংখ্যা 0 ব্যতীত এক বা একাধিক অঙ্ক দ্বারা চিহ্নিত প্যারামিটার হয় P পজিশনাল প্যারামিটারগুলি শেলটির আর্গুমেন্টগুলি সাইন করার সময় নির্ধারিত হয় এবং সেট বিল্টিন কমান্ড ব্যবহার করে পুনরায় স্বাক্ষরিত হতে পারে। অবস্থানগত পরামিতি N কে $ {N as হিসাবে উল্লেখ করা যেতে পারে, বা N একক অঙ্ক নিয়ে গঠিত হলে $ N হিসাবে উল্লেখ করা যেতে পারে। পজিশনাল প্যারামিটার অ্যাসাইনমেন্ট স্টেটমেন্টগুলির সাথে বরাদ্দ করা হতে পারে। সেট এবং শিফ্ট বিল্টিনগুলি সেগুলি সেট এবং আনসেট করতে ব্যবহৃত হয় (শেল বিল্টিন কমান্ডগুলি দেখুন)। শেল ফাংশন কার্যকর হয়ে গেলে অবস্থানের পরামিতিগুলি অস্থায়ীভাবে প্রতিস্থাপন করা হয় (শেল ফাংশন দেখুন)।

যখন একক অঙ্কের বেশি সমন্বিত অবস্থানগত প্যারামিটারটি প্রসারিত হয়, তখন অবশ্যই এটি বন্ধনীগুলিতে আবদ্ধ থাকে।

$?এবং হিসাবে $0, এই বিশেষ পরামিতিগুলি খুব পরের অংশে আচ্ছাদিত3.4.2

3.4.2 বিশেষ পরামিতি

শেলটি বেশ কয়েকটি পরামিতি বিশেষভাবে বিবেচনা করে। এই পরামিতিগুলি কেবল রেফারেন্স করা যেতে পারে; তাদের নিয়োগের অনুমতি নেই allowed

...

?

($?) সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত।

0

($ 0) শেল বা শেল স্ক্রিপ্টের নামে প্রসারিত হয়। এটি শেল প্রারম্ভিকরণে সেট করা আছে। যদি বাশকে একটি কমান্ডের একটি ফাইল (শেল স্ক্রিপ্টগুলি দেখুন) সহ আহ্বান করা হয়, that 0 ফাইলটির নামে সেট করা আছে name যদি ব্যাশ -c বিকল্প দিয়ে শুরু করা হয় (ব্যাশকে দাওয়াত দেখুন), তারপরে স্ট্রিং কার্যকর হওয়ার পরে প্রথম আর্গুমেন্টে $ 0 সেট করা থাকে, যদি উপস্থিত থাকে। অন্যথায়, এটি বাশকে আহ্বান করতে ব্যবহৃত ফাইলের নামটিতে সেট করা আছে, শূন্য আর্গুমেন্টের দ্বারা দেওয়া।


4

$1, $2... অবস্থানগত পরামিতি , সেগুলি ভেরিয়েবল নয়, পরিবেশের ভেরিয়েবলগুলিকে ছেড়ে দিন।

বোর্ন মত শেল পরিভাষা সালে $somethingবলা হয় প্যারামিটার সম্প্রসারণ (এছাড়াও কভার ${something#pattern}এবং মত কিছু শাঁস আরও ${array[x]}, ${param:offset}, ${x:|y}এবং আরো অনেক সম্প্রসারণ অপারেটার)।

বিভিন্ন ধরণের প্যারামিটার রয়েছে:

  • ভেরিয়েবল যেমন $foo,$PATH
  • অবস্থানগত পরামিতি ( $1, $2... আপনার স্ক্রিপ্টটি প্রাপ্ত আর্গুমেন্ট)
  • অন্যান্য বিশেষ পরামিতি পছন্দ $0, $-, $#, $*, $@, $$, $!, $?...

শাঁসের মতো বোর্নে পরিবর্তনশীল নামগুলি অবশ্যই একটি বর্ণানুক্রমিক অক্ষরের সাথে শুরু করা উচিত (যে কোনও লোকেল দ্বারা স্বীকৃত, বা শেলের উপর নির্ভর করে একটি-জেডএ-জেড পর্যন্ত সীমাবদ্ধ) এবং আন্ডারস্কোর এবং তারপরে শূন্য বা আরও বর্ণানুক্রমিক অক্ষর বা আন্ডারস্কোর দ্বারা অনুসরণ করা উচিত

শেলের উপর নির্ভর করে ভেরিয়েবলগুলির বিভিন্ন ধরণের (স্কেলার, অ্যারে, হ্যাশ) থাকতে পারে বা নির্দিষ্ট বৈশিষ্ট্য দেওয়া হয় (কেবলমাত্র পঠনযোগ্য, রফতানি হয়, ছোট কেস ...)।

(যেমন ঐ ভেরিয়েবল কিছু শেল দ্বারা তৈরি বা শেল বিশেষ অর্থ রয়েছে $OPTIND, $IFS, $_...)

শেল ভেরিয়েবল আছে রপ্তানি অ্যাট্রিবিউট স্বয়ংক্রিয়ভাবে রপ্তানি করা হয় বিভিন্ন পরিবেশের যে শেল, executes কমান্ড করতে।

পরিবেশ পরিবর্তনশীল শেল ভেরিয়েবল থেকে পৃথক একটি ধারণা। শেল ভেরিয়েবল রফতানি হ'ল কমান্ডের প্রয়োগের জন্য পরিবেশের পরিবর্তনশীলটি পাস করার একমাত্র উপায় নয়।

VAR=foo
export VAR
printenv VAR

কমান্ডের VARসাথে একটি পরিবেশের পরিবর্তনশীল printenv(যা আমরা এর সামগ্রীটি প্রিন্ট করতে বলছি) পাস করবে , তবে আপনি এটি করতে পারেন:

env VAR=foo printenv VAR

বা:

perl -e '$ENV{VAR}="foo"; exec "printenv", "VAR"'

এই ক্ষেত্রে.

পরিবেশের ভেরিয়েবলের কোনও নাম থাকতে পারে (কোনও অক্ষর থাকতে পারে তবে =তা খালিও হতে পারে)। এমন একটি নাম দেওয়া ভাল ধারণা নয় যা একটি পরিবেশের পরিবর্তনে বোর্নের মতো শেল ভেরিয়েবলের সাথে সামঞ্জস্যপূর্ণ নয় তবে এটি সম্ভব:

$ env '#+%=whatever' printenv '#+%'
whatever

শেলগুলি পরিবেশের ভেরিয়েবলগুলি ম্যাপ করবে যা তারা কেবল সেই পরিবেশের ভেরিয়েবলগুলির জন্য শেল ভেরিয়েবলগুলিতে গ্রহণ করে যার নাম বৈধ শেল ভেরিয়েবল (এবং কিছু শেলগুলিতে কিছু বিশেষ পছন্দকে উপেক্ষা করে $IFS)।

সুতরাং, আপনি যখন কোনও 1পরিবেশের পরিবর্তনশীলটিকে একটি আদেশের কাছে স্থান দিতে সক্ষম হবেন :

$ env '1=whatever' printenv 1
whatever

এর অর্থ এই নয় যে সেই পরিবেশের ভেরিয়েবলের সাথে শেল কল করা $1প্যারামিটারের মান নির্ধারণ করবে :

$ env '1=whatever' sh -c 'echo "$1"' script-name foo bar
foo

3

না, এগুলি স্ক্রিপ্টের প্যারামিটার। উদাহরণস্বরূপ, আপনি যদি আপনার স্ক্রিপ্টটিকে কল করেন:

mynicescript.sh one two three

এরপরে স্ক্রিপ্টের ভিতরে এই প্যারামিটারগুলি উপলব্ধ থাকবে

$1 = one
$2 = two
$3 = three

এবং $ 0 হ'ল স্ক্রিপ্টটির নাম।

সুতরাং আপনি যখন স্ক্রিপ্টের বাইরে থাকবেন তখন এই ভেরিয়েবলগুলি উপলভ্য থাকে না ($ 0 ব্যতীত, / শেল নিজেই প্রদর্শন করে) bin


"সুতরাং আপনি যখন স্ক্রিপ্টের বাইরে থাকবেন তখন এই ভেরিয়েবলগুলি পাওয়া যায় না" "স্ক্রিপ্টের বাইরে" বলতে আপনার অর্থ কী , কারণ আমি আমার টার্মিনালে এই ভেরিয়েবলগুলির মান দেখতে পাচ্ছি।
ব্যবহারকারী 7681202

2
@ user7681202: আপনি আপনার টার্মিনালে কোনটি দেখতে পাচ্ছেন? $0আপনার বর্তমান টার্মিনাল প্রক্রিয়া (সম্ভবত বাশ) নির্দেশ করবে এবং $?এটি হ'ল শেষ প্রক্রিয়ার প্রস্থান কোড।
জেসি_বি

আমি gnome-terminalযুক্তিগুলি ( gnome-terminal Hello World) দিয়ে চালানোর চেষ্টা করেছি । আমি দেখতে পেলাম $0, কিন্তু দেখতে পেলাম না $1এবং $2
ব্যবহারকারী 7681202

@ জেসি_বি আপনাকে ধন্যবাদ, আমি উত্তরে $ 0 এর সামগ্রী যুক্ত করেছি।
জারোস্লাভ কুচেরা

1
@ user7681202 জিনোম-টার্মিনাল শেল নয়, এটি টার্মিনাল এমুলেটর (যেমন এক্সটারেম, কনসোল ইত্যাদি)। শেলটি টার্মিনালের অভ্যন্তরে চলে এবং এটি বাশ / শ / zsh / tcsh এবং আরও অনেক কিছু হতে পারে। স্ক্রিপ্টটি যথাযথ শিরোলেখ (যেমন #! / Bin / bash) এবং মাস্কে নির্দিষ্ট শেল দ্বারা ব্যাখ্যাযোগ্য সামগ্রী সহ এক্সিকিউটেবল ফাইল। এটি সাধারণত প্রত্যয় ব্যবহার করে .sh
জারোস্লাভ কুসেরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.