শেল ভেরিয়েবল রফতানি হয় কিনা তা যাচাই করার সহজ স্ক্রিপ্টযোগ্য উপায় কী?


20

কিছু শেল সেশনের জন্য আমি শেল ভেরিয়েবলটি সেট না করে এবং রফতানি না করা হলে একটি সতর্কতা পতাকা মুদ্রণ করতে সক্ষম হতে চাই।

SET_MEআনসেট বা শূন্য থাকলে প্রম্পটে "ত্রুটি" প্রিন্ট করার জন্য এই জাতীয় কিছু করা মোটামুটি সহজ ।

test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '

তবে আমি SET_MEএটি রফতানি না করে সেট করলে এটি ফ্ল্যাগ করতে ব্যর্থ হয় , এটি একটি ত্রুটি যা আমি সনাক্ত করতে সক্ষম হতে চাই। $(bash -c 'test -z "$SET_ME" && echo Error;')এর আউটপুট যেমন বা গ্রেপিংয়ের কিছু সংক্ষিপ্ত, রফতানি হয়েছে exportকিনা তা পরীক্ষা করতে আমি কি করতে পারি এমন একটি সাধারণ চেক SET_MEআছে?

একটি নন-পসিক্স, ব্যাশ-কেবলমাত্র সমাধান সম্পূর্ণ গ্রহণযোগ্য।

উত্তর:


11

ব্যবহার করুন declareকমান্ড রেগুলার এক্সপ্রেশন ম্যাচিং অপারেটর:

test_var () {
    # $1 - name of a shell variable
    var=$1
    [[ -z "${!var}" ]] && echo Error
    [[ $(declare -p $1)  =~ ^declare\ -[aAilrtu]*x[aAilrtu]*\  ]] || echo Error
}

আমি মনে করি এটিই আমি খুঁজছি। তত্ত্ব অনুসারে, পুনরায় আরও নমনীয় হওয়া প্রয়োজন, উদাহরণস্বরূপ যদি আমার কাছে কেবল পঠনযোগ্য রফতানি চলক থাকে তবে বাস্তবে আমি অন্য typesetবৈশিষ্ট্যগুলি কখনই ব্যবহার করি না ।
সিবি বেইলি

ভাল যুক্তি. আমি এটি উত্তরোত্তর জন্য ঠিক করব।
চিপনার

দেখে মনে হচ্ছে নিয়মিত এক্সপ্রেশনটি উদ্ধৃত করার চেষ্টা এটিকে ব্যাশ> = 3.2 এ নিয়মিত প্রকাশ হিসাবে কাজ করা বন্ধ করে দেয়।
সিবি বেইলি

এছাড়াও একটি অসঙ্গতি আছে, -z "$1"ধরে নেওয়া হয় আমি একটি ভেরিয়েবলের মান test_var(যেমন ছিলাম) তে যাচ্ছি যেখানে declare -pএর নামটি প্রত্যাশা করে। আমি এই পরীক্ষাটি যা শেল ভেরিয়েবলের নাম নেয় নিয়ে এসেছেন: test_exported_notnull () { re='^declare -\w*x'; [[ -n $(eval echo \$$1) ]] && [[ $(declare -p "$1") =~ $re ]]; }
সিবি বেইলি

এড়াতে eval, এই প্রথম লাইনটি যুক্ত করুন:, var=$1তারপরে ব্যবহার করুন [[ -z "${!var}" ]] && echo Error
চিপনার

4

আমি সচেতন যে প্রশ্নটি 3 বছরের পুরানো, তবে যে কোনও একটি নিম্নলিখিত সমাধানটি সহজ পেতে পারে:

[ "$(bash -c 'echo ${variable}')" ]

উত্তরগুলি, যদি ভেরিয়েবলটি রফতানি হয় এবং খালি মূল্য থাকে।


4

ইন ব্যাশ 4.4 বা পরবর্তী , আপনি ব্যবহার করতে পারেন ${parameter@a} শেল প্যারামিটার সম্প্রসারণ একটি প্যারামিটার সম্পর্কে গুণাবলীর জানতে--, যদি রপ্তানি করা হয় সহ।

এখানে একটি সাধারণ ফাংশন প্রদর্শন করা হচ্ছে ${parameter@a}, যা আপনাকে বলবে যে কোনও প্রদত্ত ভেরিয়েবলের নামটি দেওয়া হলে রফতানি করা হয়:

function is_exported {
    local name="$1"
    if [[ "${!name@a}" == *x* ]]; then
        echo "Yes - '$name' is exported."
    else
        echo "No - '$name' is not exported."
    fi
}

ব্যবহারের উদাহরণ:

$ is_exported PATH
Yes - 'PATH' is exported.
$ foo=1 is_exported foo
Yes - 'abc' is exported.
$ bar=1; is_exported bar
No - 'abc' is not exported.
$ export baz=1; is_exported baz
Yes - 'baz' is exported.
$ export -n baz; is_exported baz
No - 'baz' is not exported.
$ declare -x qux=3; is_exported qux
Yes - 'qux' is exported.

কিভাবে এটা কাজ করে:

প্রত্যাবর্তিত ফর্ম্যাটটি ${parameter@a}প্রতিটি বৈশিষ্ট্য অনুসারে একটি অক্ষর, ঘোষিত কমান্ড থেকে সংশ্লিষ্ট বিকল্পগুলি থেকে প্রতিটি বৈশিষ্ট্যের অক্ষরের অর্থ আসে - এই ক্ষেত্রে আমরা সন্ধান করতে চাই x- রফতানি করে।


আপনি যদি 4.4 বাশ বা আরও নতুন ব্যবহার করে থাকেন তবে সেরা উত্তর!
অ্যান্ডি

3

কোনও ভেরিয়েবল রফতানি হয় কিনা তা নির্ধারণ করতে আপনি compgenতার -Xবিকল্পটি ব্যবহার করতে পারেন :

compgen -e -X "!$MAY_BE_EXPORTED_VARIABLE"

উদাহরণ:

$ NOT_EXPORTED="xxx"
$ compgen -e -X '!SHELL'
SHELL
$ compgen -e -X '!NOT_EXPORTED'
$ echo $?
1

সেরা সুসংগত উত্তর! A {প্যারামিটার @ এ} সমাধানের চেয়ে দ্বিগুণ ধীরে ধীরে, তবে বাশ 3.2 কেসের জন্য আরও বেশি সামঞ্জস্যপূর্ণ
অ্যান্ডি ২

2

যদি আমি নিজেকে ব্যবহার না করে পদত্যাগ করি exportএবং grep, সবচেয়ে সহজ পরীক্ষা সম্ভবত এটির মতো।

export | grep -Eq '^declare -x SET_ME='

অথবা যদি আমি নন-নালও চাই:

export | grep -Eq '^declare -x SET_ME=".+"'

1
পজিক্স 7 বলে যে exportএটি অনির্ধারিত, এবং ব্যাশের export -pমতো exportতবে ভিন্নর জন্য একটি সুনির্দিষ্ট বিন্যাস সংজ্ঞায়িত করে । কিন্তু ব্যাশ POSIX উপেক্ষা করুন এবং হিসাবে একই বিন্যাস ব্যবহার বলে মনে হয় exportজন্য export -p!
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

1

exportকমান্ড পরামিতি ছাড়াই দেওয়া, বর্তমান পরিবেশে রপ্তানি নামের একটি তালিকা দেয়:

$ FOO1=test
$ FOO2=test
$ export | grep FOO
$ export FOO2
$ export | grep FOO
declare -x FOO2="test"

কিছু কাটা এবং সেডিং ফ্লাফ থেকে মুক্তি পায়:

export | cut -d' ' -f 3- | sed s/=.*//

আপনার রফতানির তালিকা রয়েছে, আরও প্রক্রিয়াজাতকরণের জন্য প্রস্তুত।


1
এটি কাজ করে তবে exportআমার পরিকল্পনামূলক ব্যবহার আমার প্রম্পটে রয়েছে বলে আমি কম ইম্প্রুলেটেড কাঁটাচামচ (তাই "এর সংক্ষিপ্ত [...] আউটপুট গ্রেপিং ") সহ একটি হালকা উত্তরের জন্য আশা করছিলাম ।
সিবি বেইলি

@ চার্লসবাইলি: আমি দেখছি। আমি বাশ ম্যানপেজটি অনুসন্ধান করে এটিতে exportএসেছি এবং আমি কেবল এটিই সামনে এসেছি। শেল থেকে কোনও সহায়তাও পালাতে পারে না। exportযাহাই হউক না কেন builtin, কিন্তু আমার সন্দেহ আপনি এড়াতে পারেন grep
দেবসোলার

1

আমি বর্তমানে সবচেয়ে সহজ পদ্ধতিটি সম্পর্কে ভাবতে পারি:

[ bash -c ': ${v1?}' 2>/dev/null ]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.