এতে বিন্দু (।) সহ একটি চলক রফতানি করা হচ্ছে


38

এর মধ্যে বিন্দুযুক্ত একটি চলক কীভাবে রপ্তানি করা যায়। আমি চেষ্টা করার পরে আমি 'অবৈধ ভেরিয়েবলের নাম' পাই:

 export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name

এমনকি মেটাচার্যাক্টর ডট (।) এড়িয়ে যাওয়া এমনকি কোনওভাবেই সহায়তা করেনি

$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier


1
দুর্ভাগ্যক্রমে এটি তালিকাবদ্ধ হয় না যখন আমি অনুরূপ প্রশ্ন টাইপ / অনুসন্ধান করেছি। দুঃখিত। ..
ব্যবহারকারী 1587504

উত্তর:


49

কমপক্ষে bashম্যান পেজের জন্য রফতানি বাক্য গঠনটি সংজ্ঞায়িত করা হয়:

export [-fn] [name[=word]] ...

এটি একটি "নাম" হিসাবেও সংজ্ঞায়িত করে:

   name   A  word  consisting  only  of alphanumeric characters and under
          scores, and beginning with an alphabetic character or an  under
          score.  Also referred to as an identifier.

সুতরাং আপনি সত্যই কোনও ভেরিয়েবল সংজ্ঞায়িত করতে পারবেন না my.homeকারণ এটি কোনও বৈধ শনাক্তকারী নয়।

আমি নিশ্চিত যে আপনার কেএসএর একটি শনাক্তকারীর সাথে খুব অনুরূপ সংজ্ঞা রয়েছে এবং তাই এই ধরণের ভেরিয়েবলগুলিকেও অনুমতি দেয় না। (এর ম্যান পৃষ্ঠাটি একবার দেখুন Have)

আমি আরও নিশ্চিত যে এখানে কিছু ধরণের সাধারণ মান (POSIX?) নির্দিষ্ট করে রয়েছে, যা সনাক্তকারী হিসাবে অনুমোদিত (এবং তাই একটি পরিবর্তনশীল নাম)।


আপনার যদি সত্যিই কোনও কারণে এই ধরণের পরিবর্তনশীল প্রয়োজন হয় তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন

env "my.home=/tmp/someDir" bash

যাইহোক এটি সংজ্ঞায়িত করা। তবে আবার, আপনি সাধারণ শেল সিনট্যাক্স ব্যবহার করে এটি অ্যাক্সেস করতে পারবেন না। এক্ষেত্রে আপনার সম্ভবত পার্লের মতো আরও একটি ভাষা প্রয়োজন:

perl -e 'print $ENV{"my.home"}'

উদাহরণ স্বরূপ

env "my.home=/tmp/someDir" perl -le 'print $ENV{"my.home"}'

আপনার পথ মুদ্রণ করা উচিত।


এটি পিঁপড়ের সংহতকরণের কারণেই। এবং দুর্ভাগ্যক্রমে এটি ইউনিক্স থেকে ভেরিয়েবল সেট / এক্সপোর্ট করার অনুমতি দেয় না। আপনার উত্তর গ্রহণ করা। ..
ব্যবহারকারী 1587504

1
পিঁপড়া সাধারণত একটি একক পরিবেশের পরিবর্তনশীল ANT_OPTSবা called / .antrc দ্বারা কনফিগার করা হয় । পিপীলিকা নিজেই জন্য অদ্ভুত পরিবেশের পরিবর্তনশীল নামের প্রয়োজন নেই।
মিচাস

8

এনভায়রনমেন্ট ভেরিয়েবলের কোনও নাম থাকতে পারে (খালি স্ট্রিং সহ) একটি সমান চিহ্ন বা নাল বাইট না থাকলে শেলগুলি মানচিত্রের ভেরিয়েবলগুলিকে শেল ভেরিয়েবল এবং বেশিরভাগ শেলগুলিতে ম্যাপ করে, ভেরিয়েবলের নামগুলি ASCII বর্ণানুক্রমিক অক্ষরের মধ্যে সীমাবদ্ধ থাকে এবং _যেখানে প্রথম অক্ষরটি করতে পারে ' T একটি অঙ্ক হোন (অবস্থানগত পরামিতি মত অন্যান্য বিশেষ বেশী জন্য ব্যতীত $*, $-, $@, ..., (সংশ্লিষ্ট বিভিন্ন পরিবেশের ম্যাপ নেই যা))। এছাড়াও নোট করুন যে কয়েকটি পরিবর্তনশীল শেল দ্বারা / বিশেষ সংরক্ষিত

ব্যতিক্রম:

  • rcশেল এবং মত তার ডেরাইভেটিভস esএবং akangaখালি স্ট্রিং ছাড়া যেকোনো নাম সমর্থন, এবং যারা সব-সাংখ্যিক বা ধারণ =অক্ষর (এবং সর্বদা পরিবেশ তাদের সমস্ত ভেরিয়েবল রপ্তানি, বিশেষ ভেরিয়েবল হুঁশিয়ার পছন্দ *, status, pid...):

    ; '%$£"' = test
    ; echo $'%$£"'
    test
    ; '' = x
    zero-length variable name
    ;
    

    যাইহোক, এটি ভেরিয়েবলগুলির জন্য নিজস্ব এনকোডিং ব্যবহার করে যার নামটি অ্যালানাম ধারণ করে না বা কমান্ডের পরিবেশে কার্যকর হওয়ার সময় অ্যারেগুলির জন্য থাকে:

    $ rc -c '+ = zzz; __ = zzz; a = (zzz xxx); env' | sed -n /zzz/l
    __2b=zzz$
    __5f_=zzz$
    a=zzz\001xxx$
    $ env +=x rc -c "echo $'+'"
    x
    $ env __2b=x rc -c "echo $'+'"
    x
    
  • এটিএন্ডটি ksh, yashএবং zsh( bashকেবলমাত্র একক-বাইট অক্ষরের জন্যও) বর্তমান স্থানীয় লোকালগুলিতে অ্যালামগুলি সমর্থন করে, কেবল এএসসিআইআই নয়।

    $ Stéphane=1
    $ echo "$Stéphane"
    1
    

    এই শেলগুলিতে, আপনি বেশিরভাগ অক্ষরকে আলফা হিসাবে বিবেচনা করতে লোকেলটি পরিবর্তন করতে পারেন, তবে এখনও এটি ASCII অক্ষরের মতো কাজ করবে না .। আপনি বোকা zshবা kshচিন্তাভাবনা করতে পারেন £একটি চিঠি, তবে তা .বা অন্য কোনও এসসিআইআই চরিত্র নয় (যেখানে ভেরিয়েবলের নামগুলিতে অক্ষরের সাথে সম্পর্কিত, [[:alpha:]]উদাহরণস্বরূপ গ্লোবের জন্য নয় )।

  • ksh93বিশেষ ভেরিয়েবল রয়েছে যার নামে একটি বিন্দুর মতো রয়েছে ${.sh.version}তবে সেগুলি পরিবেশের ভেরিয়েবলগুলিতে ম্যাপ করা হয়নি এবং এটি বিশেষ। .নিশ্চিত এটি অন্যান্য ভেরিয়েবল সংঘাত না পারে তা নিশ্চিত করা। যদি এটি কল $sh_versionকরতে পছন্দ করে থাকে তবে এর সম্ভাব্য ভাঙ্গা স্ক্রিপ্টগুলি থাকতে পারে যা ইতিমধ্যে সেই চলকটি ব্যবহার করেছিল (উদাহরণস্বরূপ দেখুন কীভাবে zshএর কিছু $pathবা $commandsবিশেষ অ্যারে / হ্যাশ ভেরিয়েবলগুলি (একটি লা সিএস) রয়েছে যা কিছু স্ক্রিপ্টগুলি ভঙ্গ করে)।

নোট যে ভেরিয়েবল সমর্থন না শাঁস ছাড়াও, / pdksh মত কিছু শাঁস না mksh অপসারণ পরিবেশ তারা গ্রহণ থেকে তাদের ( bash, একটি খালি নাম দিয়ে এক সরিয়ে ফেলা হবে ash, kshএবং bashসেই পরিবেশ স্ট্রিং যে একটি ধারণ করে না অপসারণ =চরিত্র):

$ env %%%=test 1=%%% a.b=%%% mksh -c env | grep %%%
$ env %%%=test 1=%%% a.b=%%% bash -c env | grep %%%
%%%=test
a.b=%%%
1=%%%

$ perl -le '$ENV{""}="%%%"; exec "bash", "-c", "env"' | grep %%%
$ perl -le '$ENV{""}="%%%"; exec "zsh", "-c", "env"' | grep %%%
=%%%

$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/ash",a,e);}'|tcc -run - | grep %%%
$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/zsh",a,e);}'|tcc -run - | grep %%%
%%%

আপ সংকলনে, সেরা (অধিকাংশ শাঁস দ্বারা সমর্থিত পরিবর্তনশীল নামের দিয়ে বিদ্ধ করার এবং এমনকি (না রপ্তানি শেল ভেরিয়েবল কেনার ক্ষেত্রে দেখা অথবা মিশ্র ক্ষেত্রে কমে আসে এবং) ঐ যে শাঁস মধ্যে বিশেষ এড়ানো এনভায়রনমেন্ট ভেরিয়েবল-এর জন্য বড় হাতের অক্ষরে ব্যবহারের চেষ্টা মত IFS, PS1, BASH_VERSION...)।

আপনার যদি শেলের মধ্যে এমন একটি পরিবর্তনশীল সেট করার দরকার হয় যা তাদের সমর্থন করে না, তবে তাদের ফেলে না দেয় তবে আপনি নিজেই পুনরায় পরীক্ষা করতে পারেন, এর মতো কিছু দিয়ে:

#! /bin/ksh -
perl -e 'exit 1 unless defined($ENV{"a.b"})' || exec env a.b=%%% "$0" "$@"

(স্পষ্টতই, যদি আপনাকে স্ক্রিপ্টের মাঝখানে এটি করার দরকার হয়, এটি সাহায্য করবে না, তবে আপনাকে পুনরায় সম্পাদনের মাধ্যমে শেল প্রয়োগের পরিবেশ সংরক্ষণ এবং পুনরুদ্ধার করতে সেই পদ্ধতির দিকে একবার নজর রাখতে হবে )। অথবা ডিবাগার পদ্ধতির চেষ্টা করুন:

gdb --batch-silent -ex 'call putenv("a.b=%%%")' --pid="$$"

(যে এক সঙ্গে কাজ বলে মনে হয় zsh, yash, cshএবং tcshলিনাক্স AMD64 উপর, কিন্তু অন্যান্য শাঁস আমি চেষ্টা (সাথে না mksh, ksh93, bash, dash))।


1
mksh(এবং pdksh) প্রকৃতপক্ষে যে সমস্ত পরিবেশগত প্রক্রিয়াগুলি তারা উদ্ভাসিত হয়েছিল সেগুলি সম্পূর্ণভাবে স্ক্র্যাচ থেকে পেয়ে যায়, বর্তমান শেল এক্সিকিউশন পরিবেশে রফতানি করা প্যারামিটারগুলি ব্যবহার করে, lls শেলগুলির মধ্য দিয়ে সেই পরিবর্তনগুলি পাস করার কোনও উপায় নেই। (নোট যে ভেরিয়েবল যে হয় ; যেমন আমি সমর্থন অ্যারের রপ্তানি করার পরিকল্পনা করছি পাস পরিবর্তন সাপেক্ষে mkshএকদিন।)
mirabilos

0

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

যাইহোক, এই পরিস্থিতিতে প্রতিটি ক্ষেত্রে, সেই কী-মানযুক্ত জোড়গুলি কেবল পরিবেশের ভেরিয়েবলের চেয়ে অন্য উপায়ে প্রোগ্রামে পৌঁছে দেওয়া যেতে পারে। উদাহরণস্বরূপ, পিঁপড়ায়, আপনি কী-মানগুলির একটি সম্পত্তি ফাইল ফর্ম্যাট করা সংগ্রহে "-propertyfile (ফাইলের নাম)" ব্যবহার করতে পারেন। কনফিড "-ব্যাকেন্ড ফাইল-ফাইল (ইয়ামল ফাইল)" এর অনুমতি দেয়।

আমি "C__any_value = 'my.property.key = মান'" আকারে পরিবেশের ভেরিয়েবলগুলি পাস করেছি। আমি প্রথমে ফাইলটি উত্পন্ন করার জন্য প্রোগ্রামের অনুরোধটি স্যুইচ করেছি:

set | awk -- 'BEGIN { FS="'\''" } /^C__/ {print $2}' > my-key-values.txt

setকমান্ড বাহিত শেল, ইচ্ছা আউটপুট আকারে একটি পৃথক লাইন প্রতিটি সম্পত্তিতে

C__any_value='my.property.key=the value'

awkকমান্ড শুধুমাত্র এনভায়রনমেন্ট ভেরিয়েবল দিয়ে শুরু প্রক্রিয়া হবে C__, তারপর মান একক উদ্ধৃতি অন্তর্ভুক্ত নিষ্কর্ষ।

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

$ C__1="%my.key=the'value%"
$ set | awk -- 'BEGIN { FS="%" } /^C__/ {print $2}'
my.key=the'"'"'value

(সুনির্দিষ্ট আউটপুটটি আপনার শেলের উপর নির্ভর করবে)) উদ্ধৃতি অব্যাহতি ডিকোড করার জন্য আপনাকে অতিরিক্ত পদক্ষেপ নিতে হবে।

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