“_ =” এর অর্থ কী?


29

আমি চালানোর পরে set -a var=99, এর আউটপুটটিতে আমি একটি বাক্য খুঁজে পেতে পারি set:

...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...

"_ =" এর অর্থ কি কেউ আমাকে বলতে পারেন?

আমি নোট করছি যে echo $varকিছুই দিতে হবে। আমি যদি চালনা করি set -aতবে এর পরে আর setএই পরিবর্তনশীলটি অন্তর্ভুক্ত হবে না। কি হচ্ছে?


উত্তর:


16

আপনি যখন মৃত্যুদন্ড কার্যকর করেন set -a var=99, তিনটি স্বতন্ত্র জিনিস ঘটে (আপনার প্রশ্নের সাথে সম্পর্কিত):

  1. ভার রফতানি করার জন্য একটি সেট বিকল্প ( -a) (করে বিপরীত set +a)।
  2. অবস্থানগত পরামিতিগুলি বিকল্পগুলি অনুসরণ করে যা সেট করে "সেট" $1হয় var=99)
  3. শেল ভেরিয়েবল আন্ডারস্কোরটি $_সর্বশেষ প্যারামিটারে সেট করা হয়েছে (প্রসারিত)।

সেট -এ

সঞ্চালনের set -aচিহ্ন সব পরবর্তী (নতুন বা পরিবর্তন করা হয়েছে) ভেরিয়েবলের রপ্তানি হিসাবে (সমস্ত শাঁস মধ্যে ছাড়া cshএবং কিছু সংশ্লিষ্ট শাঁস)।

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

এই সেটিং থেকে পুনরুদ্ধার করার জন্য, শুধু পরিবর্তন -একটি থেকে +:

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

সেট var = 99

কোনটি set -- var=99হ'ল ড্যাশ ( -) দিয়ে শুরু হওয়া মানগুলির সাথে কোনও বিকল্পের (এবং সেটটির প্রচুর পরিমাণ রয়েছে) ব্যাখ্যা এড়ানো উচিত ।

এর পরে আর্গুমেন্টের তালিকা (অবস্থানগত প্যারামিটারগুলির তালিকা) সেট করে --। এটি সমস্ত যুক্তিসঙ্গত শেলগুলিতে বৈধ (সিএসএস এট এ নয়)। অবস্থানগত আর্গুমেন্টগুলি "$ @" (বা অনুরূপ "$ *" সমান নয়) দিয়ে মুদ্রিত হয়।

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

: _ = Last_argument

এবং, অভ্যন্তরীণ শেল ভেরিয়েবলের মান _কার্যকর করা লাইনের শেষ যুক্তিতে পরিবর্তিত হয়। যে না প্রায় সব শাঁস মধ্যে (jsh, ছাই, যশ, ড্যাশ, lksh, mksh, ksh93, attsh এবং অবশ্যই csh শেল এবং tcsh শেল এর) ব্যাশ ব্যতীত সত্য।

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

দয়া করে নোট করুন যে মানটি $_হ'ল প্রসারণের পরে:

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

এজন্য আপনি যখন মৃত্যুদন্ড কার্যকর করবেন:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

আপনি শেল ভেরিয়েবল '$ _' এর বর্ণনা পাবেন। এটিও কাজ করে:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"

37

আন্ডারস্কোরটি আসলে একটি বিশেষ শেল পরিবর্তনশীল। আপনি এখানে যা দেখছেন তা হ'ল _মান সহ আন্ডারস্কোর ( ) ভেরিয়েবল var=99। এটি কেবল পঠনযোগ্য, এবং খোল দ্বারা রক্ষণাবেক্ষণ করা হয়। এটাই:

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

আপনার উদাহরণ দ্বিতীয় বিভাগে পড়ে। আপনি টাইপ করেছেন:

set -a var=99  

সুতরাং সেখানে সর্বশেষ যুক্তি ছিল var=99, এবং এটিই আপনি মান নির্ধারণ করছেন (আপনি সেট varকরে নিছিলেন না 99)। সুতরাং, _যে সেট করা হয়েছিল। এবং এটিই জানাচ্ছে:

_=var=99  

এটি কিছুটা বিভ্রান্তিকর, তবে প্রথমটি =ভেরিয়েবলের জন্য অ্যাসাইনমেন্টটি নির্দেশ করে_ এবং দ্বিতীয়টি মানটির অংশ।

এটিও উল্লেখযোগ্য যে -aবিকল্পটি পরবর্তীকালে সংজ্ঞায়িত সমস্ত ভেরিয়েবলগুলি রফতানি করার setকারণ ঘটায় ।


16

সঠিক উত্তরটি আপনি যে শেলটি ব্যবহার করছেন তার উপর নির্ভর করবে:

  • জন্য bash, @Obesier এ যা কিছু বলেছে তা প্রযোজ্য
  • কারণ zshএটি কেবল পূর্ববর্তী কমান্ডের সর্বশেষ যুক্তি এবং কমান্ডের পরিবেশে কমান্ডের পুরো পথের সাথে সেট করা আছে
  • dashইন্টারেক্টিভ সেশন চলাকালীন কিছু শেল কেবল এই পরিবর্তনশীলটি সেট করে

অন্যান্য শেলগুলিতেও অন্যান্য বিশদ থাকতে পারে। যেমনটি পসিক্সে সংজ্ঞায়িত করা$_ হয় না , সুতরাং এটি ব্যবহার করার সময় কারও পক্ষে সম্ভাব্য পোর্টেবিলিটি সমস্যা সম্পর্কে সচেতন হওয়া উচিত।

পার্শ্ব নোট: যদি আপনার উদ্দেশ্যটি 99 এর মান নির্ধারণ করে varএবং পরবর্তী উপ-প্রক্রিয়াগুলির পরিবেশে এটি উপলব্ধ করা হয় তবে এটি অর্জনের সঠিক বাক্য গঠনটি হ'ল:

export var=99

2
একটি সঠিক বাক্য গঠনও unset var;set -a; var=99। সমস্ত অনুরোধযোগ্য শেলগুলিতে কাজ করে (সিএসএস এট নয়)।
তীর

1
@ অ্যারো যদিও বব ইগ্রারের উত্তরের শেষ লাইন অনুসারে এটি পরে সমস্ত পরিবর্তনশীল রফতানি করে সেট / পরিবর্তিত করে তোলে যা আপনি যা চান তা নাও হতে পারে।
ট্রিপহাউন্ড

8

এবং আমি নোট করছি echo $varকিছুই দিতে হবে। … কি হলো?

বাশ (1) এর সূক্ষ্ম প্রিন্টে আমরা খুঁজে পাই find

set[ --abefhkmnptuvxBCEHPT] [ বিকল্প-নাম ] [ আরগ …]   [ ] [ বিকল্প নাম ] [ আরগ …]-o
set+abefhkmnptuvxBCEHPT+o

            Options
    বিকল্পগুলি নির্দিষ্ট করা হলে, তারা শেল বৈশিষ্ট্যগুলি সেট বা আনসেট করে দেয়। বিকল্প প্রক্রিয়াকরণের পর অবশিষ্ট আর্গুমেন্টগুলি জন্য, অবস্থানগত পরামিতি মান হিসাবে গণ্য করা হয় এবং হস্তান্তর করা হয়েছে, $1, $2, ... ।$n

যার মানে, set -a var=99এনভায়রনমেন্ট ভেরিয়েবল সেট করেনি varথেকে 99; এটা সেট করে $1করতে var=99। চেষ্টা করুন echo "$1"বা echo "$*"এবং আপনি দেখতে পাবেন।

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