এনভায়রনমেন্ট ভেরিয়েবলের কোনও নাম থাকতে পারে (খালি স্ট্রিং সহ) একটি সমান চিহ্ন বা নাল বাইট না থাকলে শেলগুলি মানচিত্রের ভেরিয়েবলগুলিকে শেল ভেরিয়েবল এবং বেশিরভাগ শেলগুলিতে ম্যাপ করে, ভেরিয়েবলের নামগুলি 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
))।