ব্যাশে `সেট-কে` বিকল্পের ব্যবহারিক ব্যবহার


16

আমরা কখন set -kবাশে বিকল্প ব্যবহার করব ?

বাশ রেফারেন্স ম্যানুয়ালটিতে বলা হয়েছে,

অ্যাসাইনমেন্ট স্টেটমেন্ট আকারে সমস্ত আর্গুমেন্ট পরিবেশে একটি কমান্ডের জন্য রাখা হয়, কেবল কমান্ডের নামের আগে নয়।

বিকল্পটি কী করে তা আমি বুঝতে পারি, তবে যখন আমাদের এটির প্রয়োজন হয় তখন তা কল্পনা করতে পারি নি।


সঠিক ধারণা। -kতাদের refactor প্রয়োজন ছাড়াই 30 বছর বয়সী শেল স্ক্রিপ্ট চালাতে সক্ষম। পরিবর্তে উপসর্গ বাক্সটি ব্যবহার করে অস্থায়ী পরিবেশের ভেরিয়েবলগুলি পাস করুন:var1=x var2=y command ...
হেন্ক ল্যাঙ্গভেল্ড

উত্তর:


14

আপনি শেল স্ক্রিপ্টে (যেমন আর্গুমেন্ট হিসাবে) পরিবেশের ভেরিয়েবলগুলি "ইনজেকশন" করতে চাইলে এটি মূলত আপনি এটি ব্যবহার করতে পারেন যেমন সেগুলি পরিবেশের মধ্যে স্থাপন করা হয়েছিল exportতবে exportচলমান কমান্ডগুলির আগে সেগুলি স্থায়ীভাবে তালিকার তালিকায় থাকতে না পারে without ।

দ্রষ্টব্য:-k স্যুইচটির দীর্ঘ রূপ রয়েছে set -o keyword,।

উদাহরণ

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

এখন যদি আমি set -k:

$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi

তবে আমি যদি কেবল উপরের স্ক্রিপ্টটি চালাতাম:

$ ./cmd1.bash 

$

এক্সপোর্ট কি করছে?

$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands.  If VALUE is supplied, assign VALUE before exporting.
...

সুতরাং আমরা যদি export | grep VARআমাদের স্ক্রিপ্টে এভাবে যুক্ত করে থাকি :

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

এবং আমরা আমাদের উপরের পরীক্ষাগুলি আবার চালিয়েছি:

$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"

তবে ছাড়া set -k:

$ ./cmd2.bash 

$

সুতরাং set -kআমাদের সাময়িকভাবে ভরগুলিতে ভেরিয়েবল রফতানি করার অনুমতি দিচ্ছে।

আরেকটি উদাহরণ

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

যখন আমরা একাধিক ভেরিয়েবল সেট করি তখন সেগুলি সমস্ত রফতানি হয়:

$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"

সুতরাং তাহলে এটি কেবল সমস্ত পরিবেশের ভেরিয়েবল ইনজেক্ট করছে?

কোন -kএখানে একটি খুব স্পষ্ট জিনিস করছে। এটি কেবলমাত্র ভেরিয়েবলগুলি রফতানি করে যা কমান্ড কার্যকর হওয়ার সময় কমান্ড লাইনে অন্তর্ভুক্ত ছিল।

উদাহরণ

বলুন আমি এই পরিবর্তনশীল সেট করেছি:

$ VARCMD1="hi"

এখন যখন আমরা একই কমান্ড বাদ দিয়ে চালাচ্ছি VARCMD1="hi":

$  set -k; ./cmd3.bash VARCMD2="bye"; set +k

bye
declare -x VARCMD2="bye"

তবে কেন এর অস্তিত্ব আছে?

আমি এই উত্সটি পেয়েছি যা এই বৈশিষ্ট্য সম্পর্কে কিছুটা ব্যাখ্যা করে, শিরোনাম: "কীওয়ার্ড প্যারামিটার অ্যাসাইনমেন্ট স্ট্রিংস"। দ্রষ্টব্য: উত্স URL টি একটি আইপি ঠিকানা ব্যবহার করে তাই আমি এখানে সরাসরি এসইতে লিঙ্ক করতে পারি না।

http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html

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

  • কোনও অপ্রত্যাশিত প্রভাব এড়াতে, সর্বদা একটি কমান্ড স্ট্রিংয়ের সামনে প্যারামিটার অ্যাসাইনমেন্ট সাবস্ট্রিং রাখুন।

    বি শেলটিতে, কীওয়ার্ড পরামিতিগুলির নির্ধারিত মানগুলি (স্থানীয়) শেল ভেরিয়েবলগুলিতে সঞ্চিত হবে। বাশ এবং কেএস-তে, পূর্ববর্তী কমান্ডের মূলশব্দ প্যারামিটার অ্যাসাইনমেন্ট স্ট্রিংগুলি শেল ভেরিয়েবলগুলিতে সংরক্ষণ করা হবে না। তারা কেবল বর্তমান কমান্ডটি কার্যকর করার জন্য প্রস্তুত তাত্ক্ষণিক সাবপ্রসেসকে প্রভাবিত করে। মূলশব্দ প্যারামিটার অ্যাসাইনমেন্ট স্ট্রিংগুলির একটি লাইন একা (স্থানীয়) শেল ভেরিয়েবলগুলিতে সঞ্চয় হয়। কীওয়ার্ড প্যারামিটার অ্যাসাইনমেন্ট স্ট্রিংগুলি উপসর্গ, ঘোষণা, টাইপসেট, রফতানি, পঠনযোগ্য এবং স্থানীয় অন্তর্নিহিত কমান্ডের পক্ষে যুক্তি হিসাবে উপস্থিত হতে পারে। [বাশ রেফারেন্স ম্যানুয়ালের ৩.৪ ধারা]

  • মূলশব্দ প্যারামিটার অ্যাসাইনমেন্ট স্ট্রিংগুলি কমান্ডের নামের পরে স্থাপন করা হলে, আদেশটি কার্যকর করার জন্য আর্গুমেন্ট হিসাবে বিবেচিত হবে।

  • কী-ওয়ার্ড প্যারামিটারগুলি সেট কমান্ড দ্বারা ম্যানিপুলেট করা যেতে পারে।

এই লিঙ্কটিতে, ss64.com/bash/set.html , কারণ set -kতারা বিকল্প -o keywordছাড়াও দিয়েছেন -k। তার মানে কি কিছু?
রমেশ

@ রমেশ - set -o keywordএর দীর্ঘ রূপ set -k। দেখুন help set | grep -- '-k'
SLM

আহ, ঠিক আছে. 2 টি বিকল্প কেন আছে তা বোঝার চেষ্টা করে আমি দীর্ঘদিন ধরে আমার মাথা আঁচড়ান। যথারীতি যথাযথ উত্তর :)
রমেশ

4
./cmd.bash VARCMD=hiদরকার set -kঠিক পথ কাজে এটি পেতে VARCMD=hi ./cmd.bashছাড়া করে set -k। অনুমান করুন যে ./cmd.bash VARCMD=hi
ওপি'র

@ 1_CR - ভাল পয়েন্ট। আমি বিশ্বাস করি এটি স্টাইলের সাথে আরও কিছু করার আছে, আমি যদি দেখি তবে আমি কোনও আসল উত্স খুঁজে পেতে পারি কিনা।
SLM

8

কোনও ব্যবহারিক ব্যবহার set -kসম্ভবত ব্যক্তিগত স্টাইল। কিছু - সম্ভবত যারা প্রোগ্রামিং ভাষাগুলি পছন্দ করে যা ফাংশন কলগুলিতে কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহারের দক্ষতা দেয় বা যারা ddকমান্ডের বাক্য গঠন পছন্দ করে - তাদের পছন্দ হতে পারে

সেট-কে
...
কমান্ড var 1 = ভাল 1 var 2 = ভাল 2

প্রতি

var 1 = ভাল 1 var 2 = ভাল 2 কমান্ড

বিকল্পটি কয়েকটি শেলের মধ্যে উপস্থিত থাকার প্রকৃত কারণটি পসিক্স স্ট্যান্ডার্ডে সেট কমান্ডের যুক্তি দিয়ে ব্যাখ্যা করা হয়েছে :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.