শেল ভেরিয়েবলগুলি রফতানি হয় কিনা আপনি কীভাবে তা নির্ধারণ করবেন?


13

বোর্ন শেল পরিবারের সাথে, শেল ভেরিয়েবলগুলির সকলের বড় হাতের অক্ষর থাকে; যার অর্থ আপনি কোনও নির্দিষ্ট ভেরিয়েবলটি পরিবেশের পরিবর্তনশীল কিনা তা কেবলমাত্র এর নামটি দেখলে তা বলতে পারবেন না। আপনি কীভাবে নির্ধারণ করবেন যে কোন বোর্ন শেল ভেরিয়েবলগুলি স্থানীয় (কেবলমাত্র বর্তমান শেলের মধ্যে সংজ্ঞায়িত)?


4
বোর্ন শেল বা বোর্ন-আবার শেল? আপনি বড় হাতের চলক জিনিস জন্য একটি রেফারেন্স নির্দেশ করতে পারেন?
জেফ শ্যাচলার

বোর্ন-রিইন শেল থেকে যেহেতু সমস্ত ভেরিয়েবলগুলি বড় হাতের হয় তাই আপনি কোন বাশ ভেরিয়েবল স্থানীয় তা কীভাবে নির্ধারণ করতে পারেন?
কাঁধপ্যাডজ

7
@ সোল্ডারপ্যাডজ কিছুই আপনাকে ছোট হাতের ভেরিয়েবল তৈরি করা থেকে বাধা দিচ্ছে না।
মুড়ু

1
দ্বারা স্থানীয় আপনি ভেরিয়েবল যে রপ্তানি হয়নি মানে?
এলিয়াহ কাগন

4
আপনি যে পার্থক্যটির বিষয়ে জিজ্ঞাসা করছেন তা হ'ল শেল ভেরিয়েবল বনাম পরিবেশের ভেরিয়েবল, গ্লোবাল বনাম স্থানীয় নয়। মনে রাখবেন এমন শেল ভেরিয়েবল রয়েছে যা পরিবেশের ভেরিয়েবল নয় (যেমন, আপনি কী "স্থানীয়" বলছেন), এবং এমন পরিবেশের ভেরিয়েবল রয়েছে যা শেল ভেরিয়েবল নয় (পরিবেশে এমন নাম থাকতে পারে যা বৈধ শেল সনাক্তকারী নয় এবং এইভাবে পরিবর্তনশীল হতে পারে না)।
চিপনার

উত্তর:


17

যদি আপনি দেখতে চান যে কোনও ভেরিয়েবলটি রফতানি করা হয়েছে কি না, ব্যবহার করুন declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

সর্বাধিক বহনযোগ্য উপায় export -p

export -pরফতানি চলক তালিকা। সাধারণত ভালো হয় declare -x, যদি আপনার শেল হয়েছে declare

বর্তমানে ব্যবহৃত বোর্ন-স্টাইলের শেলগুলি সমর্থন করা উচিত export -p, যেমন এটি পসিক্স দ্বারা প্রয়োজনীয় :

যখন -p উল্লেখিত থাকে, তবে রপ্তানি মানক আউটপুটে লিখব নাম এবং সব রপ্তানি ভেরিয়েবল মূল্যবোধ, নিম্নলিখিত বিন্যাসে:

"export %s=%s\n", <name>, <value>

যদি নামটি সেট করা থাকে এবং:

"export %s\n", <name>

যদি নামটি সেট না করা হয়।

স্ট্যান্ডার্ডটি ব্যাখ্যা করে চলেছে যে ভেরিয়েবলের মানটি এমনভাবে প্রদর্শিত হয় যা সাধারণত এটি পরে =কোনও অ্যাসাইনমেন্টের ডানদিকে ব্যবহার করতে দেয় । এটি বলা যেতে পারে যে এটি উদ্ধৃত করা যেতে পারে। বিভিন্ন শেল এগুলিকে আলাদাভাবে প্রদর্শন করতে পারে তবে একই প্রভাব সহ। export -pএমনকি declareশশগুলিতেও কাজ করে যার ড্যাশের মতো কোনও বিল্টিন নেই ।

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

grepকম্প্যাক্টনেসের জন্য আমি আউটপুটটি পাইপ করেছি তবে আপনি যদি এটি ফিল্টার না করেন তবে আপনি আপনার রফতানি ভেরিয়েবলগুলির সম্পূর্ণ তালিকা পাবেন। আপনার প্রশ্ন থেকে মনে হচ্ছে এটি আপনাকে সবচেয়ে দরকারী বলে মনে হতে পারে।

কিছু শেল, যেমন বাশের মতো একটি মানসম্মত বিন্যাস ব্যবহার করে তবে স্পষ্টভাবে কোনও পসিক্স-অনুবর্তী পদ্ধতিতে আচরণের নির্দেশ না দেওয়া হয়। ইন বাশ ডিফল্ট export -pহিসাবে একই আউটপুট দেয় declare -x

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

POSIX সামঞ্জস্যতা সক্ষম থাকলেও Zsh একটি অ-মানক ফর্ম্যাট দেখায়:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

যে কোনও ক্ষেত্রে, আপনি কোনও শব্দ অনুসরণ করে পোর্টেবল উপস্থাপনা (যা উদ্ধৃত করা যেতে পারে) বের করতে পারেন =। এটি লাইনের পূর্ববর্তী শব্দের উপর নির্ভর করে না, যতক্ষণ না তারা তাত্ক্ষণিকভাবে পূর্ববর্তী অবস্থা না করে =, যা তাদের উচিত নয়। উদাহরণ স্বরূপ:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

মনে রাখবেন যে সমস্ত এন্ট্রি অগত্যা নয়= । এর কারণ ভেরিয়েবলগুলি আনসেট করা যায় তবে রফতানি করা যায়। এই এন্ট্রিগুলি grepউপরের কমান্ড দ্বারা ফিল্টার করা হয় , যা আপনি চান তা হতে পারে বা নাও পারে।

বেশিরভাগ সময়ে, আপনি শুধু আউটপুট পরিদর্শন করতে চান এবং যাতে আপনি পরোয়া করা হবে না এন্ট্রি পূর্বে যদি export, declare -x, typeset -x, নাকি অন্য কিছু। তারপরেই দৌড়াও export -p

আমি প্রতিটি শেলের আনুষ্ঠানিকভাবে প্যাকেজযুক্ত সংস্করণগুলি সহ উবুন্টু 16.04 এলটিএসে এই আদেশগুলি পরীক্ষা করেছি ।


0

ভেরিয়েবল যে নয় রপ্তানি আউটপুট থেকে দেখা যায় declareব্যাশ কমান্ড।

যে চলকগুলি রফতানি হয় তা বাশের আউটপুট declare -xবা exportকমান্ড থেকে দেখা যায় ।

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