পক্সিক্স শেল: পরিবেশ পরিবর্তনশীল নামের মুদ্রণের তালিকা (মান ব্যতীত)


11

একাধিক বাস্তবায়নের সাথে কাজ করে এমন একটি পজিক্স-সামঞ্জস্যপূর্ণ উপায়ে, আমি কীভাবে বর্তমানে তাদের সংজ্ঞায়িত পরিবেশের পরিবর্তনশীলগুলির তালিকাটি তাদের মানগুলি ছাড়াই মুদ্রণ করতে পারি ?

কিছু বাস্তবায়নের ক্ষেত্রে (ম্যাক্স, ফ্রিবিএসডি / বিন / শ) কেবল exportনিজেরাই ব্যবহার করা বিলটির সাথে খাপ খায় :

$ export
FOO2
FOO

তবে কিছু অন্যান্য বাস্তবায়নের জন্য (বাশ, জেডএস, ড্যাশ) exportমানও দেখায়। বাশ সহ, উদাহরণস্বরূপ:

$ export
export FOO2='as  df\
  asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd  kjasdf:\
   asdkj=fkajdsf:\
       :askjfkajsf=asdfkj:\
   safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
  asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd  kjasdf:\$
   asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
   safdkj$

অন্যান্য বিকল্পগুলির মতো envবা printenvমানগুলি ছাড়াই কেবল পরিবর্তনশীল নামগুলি মুদ্রণের বিকল্প নেই, আমি চেষ্টা করেছি এমন লিনাক্স এবং ফ্রিবিএসডি প্ল্যাটফর্মে অন্তত নয়।

অর্প / সেড / ইত্যাদিতে পাইপ দেওয়া। অথবা প্যারামিটার সম্প্রসারণ কৌশলগুলির সাথে তালিকাকে ছাঁটাই করা (যেমন, ${foo%%=*}) গ্রহণযোগ্য, তবে এটি এমন মানগুলির সাথে কাজ করতে হবে যা লাইনগুলিকে বিস্তৃত করতে পারে এবং =মানটির সাদা অংশ থাকতে পারে (উপরের উদাহরণটি দেখুন)।

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


2
আপনি যদি কিছু বিশ্লেষণ করতে যাচ্ছেন export -pতবে শেল ইনপুট জন্য উপযুক্ত যে আউটপুট উত্পন্ন করতে পসিক্স দ্বারা নির্দিষ্ট করা আউটপুট সঙ্গে যান ।
কুসালানন্দ

শেল ইনপুট করার জন্য আমার কিছু লাগবে না। আমি কেবল পরিবেশের ভেরিয়েবলের নাম চাই। সুতরাং অতিরিক্ত ক্রাফ্ট (উদাহরণস্বরূপ, প্রতিটি লাইনের সামনের দিকে 'এক্সপোর্ট' শব্দটি যেভাবেই সরিয়ে ফেলতে হবে। আমি কেন এটির জন্য ব্যবহার করতে চাই export -p?
জুয়ান

1
আপনি ব্যবহার করতে চান export -pকারণ এটি আপনাকে সমস্ত পসিক্স শেল জুড়ে একটি ধারাবাহিক আউটপুট দেয়, যা আপনি বলেছিলেন যে আপনি চেয়েছিলেন।
কুসালানন্দ

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

যদি আপনি কিছু বিশ্লেষণ করতে যাচ্ছেন তবে এর ফলাফল নিয়ে যান export -p। আমি এই পার্সিংটি লিখতে যাচ্ছি না, কারণ সাধারণ ক্ষেত্রে এটির জন্য যথাযথ উদ্ধৃতি পার্সিংও করতে হবে, যদি আপনার কোনও ভেরিয়েবল থাকে যার মান এরকম হয় hello\nexport var=value। এক কয়েক অন্যান্য কমান্ডের যে সমস্ত POSIX শাঁস মধ্যে সামঞ্জস্যপূর্ণ আউটপুট দেবে env, কিন্তু যে আউটপুট কঠিন যেহেতু এটি lacks বিশ্লেষণ করতে export =বিট।
কুসালানন্দ

উত্তর:


9

এটি বেশ সহজ।

awk 'BEGIN{for(v in ENVIRON) print v}'

তবে হুঁশিয়ার কিছু awk বাস্তবায়নের তাদের নিজস্ব এনভায়রনমেন্ট ভেরিয়েবল (যেমন গনুহ awk যোগ যোগ AWKPATHএবং AWKLIBPATHকরতে ENVIRON)।

যদি পরিবেশের ভেরিয়েবলের নামটিতে একটি নতুন লাইন থাকে তবে আউটপুট দ্ব্যর্থহীন, যা অত্যন্ত অস্বাভাবিক তবে প্রযুক্তিগতভাবে সম্ভব। একটি খাঁটি sh সমাধান কঠিন হবে। আপনার সেরা বেটটি শুরু করা export -pতবে খাঁটি sh এ এটি ম্যাসেজ করা কঠিন। এর আউটপুটটি ম্যাসেজ করার জন্য আপনি সেড ব্যবহার করতে পারেন export -p, তারপরে evalশেলটি কী উদ্ধৃত হয়েছে তা সরাতে ব্যবহার করুন । বাশ এবং zsh অ-মানক উপসর্গ মুদ্রণ।

report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
                         s/^declare -x /report /;
                         s/typeset -x /report /")"

নোট করুন যে শেলের উপর নির্ভর করে, export -pভেরিয়েবলগুলি প্রদর্শন করতে পারে বা নাও পারে যার নামটি শেলের সাথে বৈধ নয়, এবং যদি এটি না হয় তবে এটি নামগুলি সঠিকভাবে উদ্ধৃত করতে পারে বা নাও পারে। উদাহরণস্বরূপ, ড্যাশ, ম্যাক্স এবং জেডএস ওমিট ভেরিয়েবলগুলি যার নামটিতে একটি নতুন লাইন রয়েছে, ব্যাসিবক্স ড্যাশ এবং ksh93 এগুলিকে কাঁচা প্রিন্ট করে এবং বাশ তাদের মান ছাড়াই কাঁচা মুদ্রণ করে। আপনার যদি অবিশ্বস্ত ইনপুট থেকে রক্ষা করার প্রয়োজন হয় তবে খাঁটি পসিক্স সমাধানের উপর নির্ভর করবেন না এবং অবশ্যই evalআউটপুট থেকে প্রাপ্ত কোনও কিছুর উপরে কল করবেন না export -p


আমি নিশ্চিত নই যে মাল্টলাইন মান সহ সেড (1) এর সাথে এটি আসলে কতটা "সহজ" - আমি এটি দেখতে চাই। তবে awk (1) পদ্ধতির জন্য ধন্যবাদ। আমি মনে করি এটি এখন পর্যন্ত সবচেয়ে বহনযোগ্য উপায় (যদিও আমি মনে করি এটি exitপ্রয়োজনীয় নয়)।
জুয়ান

মনে রাখবেন যে আপনি যদি পান তবে আপনি FOO<newline>BARএটি জানেন না যে এটি FOO<newline>BARপরিবেশের পরিবর্তনশীল (যা export -pবেশিরভাগ শেল দিয়ে দেখায় না env $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}') বা একটি FOOএবং BARপরিবেশের ভেরিয়েবল উভয়ই নয় ।
স্টাফেন চেজেলাস

নোট করুন যে জিএনইউ awkতার নিজস্ব পরিবেশের ভেরিয়েবলগুলি সেট করে ( AWKPATHএবং AWKLIBPATHআমার সিস্টেমে)
স্টাফেন চ্যাজেলাস

@ স্টাফেনচাজেলাস - পুনরায়: ভের নামে এম্বেড করা নিউলাইন - সম্মত - শেল কোড সহ এর বিরুদ্ধে রক্ষা করা শক্ত। পুনঃআউকপাথ এবং আউলিকিপাথ দূষণ, আমি লক্ষ্য করেছি যে, এই ছদ্মবেশী সন্নিবেশও। ওটা gnu awk, bsd awk নয়।
জুয়ান

0

আমি সাধারণ জিনিস পছন্দ করি; এটি পসিক্স সিস্টেমগুলির জন্য কাজ করবে:

printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM

5
export AAA=$'multi\nBBB=line'
রোয়াইমা

@ টডডি_ডিএসএম - এটি পরিবেশের ভেরিয়েবলগুলির জন্য ব্যর্থ হয় যার মানগুলি একাধিক লাইনের বিস্তৃত থাকে (উদাহরণস্বরূপ, কখনও কখনও TERMCAP - স্ক্রিনে (1) অধিবেশন, আইআইআরসি) এ আমি দেখি। সুতরাং এই উত্তরটি মূল প্রশ্নে বর্ণিত প্রয়োজনীয়তাগুলি পূরণ করে না। আমি সাধারণও পছন্দ করি তবে এটি সাধারণত কার্যকর হয় না।
জুয়ান

খোশগল্প আপনি আপনার মূল পোস্টে আউট সম্পাদিত ব্যাশ জন্য আকর্ষণীয় ছিল: compgen -e। এটি আমার পোর্টেবল স্ক্রিপ্টিংয়ের জন্য সহায়তা করে না (যেমন, যখন বাশ পাওয়া যায় না) তবে এটি আকর্ষণীয়।
জুয়ান

শুধু কৌতূহলী, কেন নিজেকে বোর্ন (পিক্সিক্স) শেলের মধ্যে সীমাবদ্ধ রাখুন? পিক্সিক-কমপ্লায়েন্ট হওয়া দুর্দান্ত তবে আপনি সেই সাধনায় প্রচুর কার্যকারিতা হারাবেন। আপনি পোর্টেবল এবং ব্যাশের সাথে সামঞ্জস্যপূর্ণ নন; এটি জিএনইউ পরিবারের অংশ।
todd_dsm

dashডিবিয়ান ব্যবহার করে , আমি উপরের কমান্ডের সাথে একই printenv | sed 's;*=.;;' | sortমানগুলি পাই বা মানগুলি সংশোধন করে। আমি ভেরিয়েবলটি রফতানি করেছি yoএবং এটি উপরে আপনার প্রথম মন্তব্য নির্ধারণ করেছি; এটি একাধিক লাইন সহ প্রত্যাশিত হিসাবে মুদ্রিত। আপনি কী অভিজ্ঞতা নিচ্ছেন তা নিশ্চিত নন তবে কেটে যাওয়া আউটপুট হওয়া উচিত নয়। শেল কমান্ড চালান; এটি যা কাজ করে তা কীভাবে কাজ করা উচিত; কোন ছাঁটাই আশা তারপরে, TERMCAP / পর্দা / iirc প্রসঙ্গে; একই হওয়া উচিত। যদি আউটপুট মেলে না তবে সম্ভবত সেই প্রোগ্রামগুলির মধ্যে একটির সাথে এটি একটি সমস্যা।
todd_dsm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.