লিনাক্স এনভায়রনমেন্টের পরিবর্তনশীল নামগুলিতে অনুমোদিত অক্ষর


143

লিনাক্স এনভায়রনমেন্ট ভেরিয়েবলের নামগুলিতে কোন অক্ষর অনুমোদিত? ম্যান পৃষ্ঠাগুলি এবং ওয়েবে আমার কর্সারি অনুসন্ধান কেবল ভেরিয়েবলগুলির সাথে কীভাবে কাজ করবেন সে সম্পর্কে কেবল তথ্য সরবরাহ করেছিল, তবে কোন নামগুলি অনুমোদিত নয়।

আমার একটি জাভা প্রোগ্রাম রয়েছে যাতে একটি সংজ্ঞায়িত এনভায়রনমেন্ট ভেরিয়েবলের মতো একটি বিন্দু থাকতে পারে com.example.fancyproperty। উইন্ডোজের সাহায্যে আমি সেই পরিবর্তনশীলটি সেট করতে পারি তবে লিনাক্সে এটি স্থাপন করার আমার ভাগ্য ছিল না (সুয়ে এবং উবুন্টুতে চেষ্টা করা হয়েছিল)। সেই পরিবর্তনশীল নামটিও কি অনুমোদিত?


3
ভাগ্যক্রমে, আমি দেখতে পেয়েছি যে প্রোগ্রামটি জাভা সিস্টেমের সম্পত্তি ( -Dকমান্ড লাইনের বিকল্পের সাথে ঘোষিত ) হিসাবে ঠিক ততই খুশি , সুতরাং এটি এখন কার্যকর হয়। স্পষ্টতই প্রোগ্রামটি আমাকে না বলে উভয় ভেরিয়েবল সেটে দেখায়। তবে তবুও আমি আগ্রহী যে কোন পরিবেশের পরিবর্তনশীল নামগুলি অনুমোদিত।
খ্রিস্টান সেমরাউ

@ আলেকসান্ডারডুবিনস্কি আমি এটি মুছে ফেলেছি। এটি একইরকম তবে উরফ
লাইম

1
আপনি যদি স্প্রিং ব্যবহার করছেন , তবে ডিফল্ট সিস্টেম-পরিবেশ পরিবেশ-উত্সও সন্ধান করবে com_example_fancypropertyএবং COM_EXAMPLE_FANCYPROPERTY
আলেকসান্দ্র ডাবিনস্কি

উত্তর:


203

থেকে ওপেন গ্রুপ :

এই স্ট্রিংগুলির ফর্মের নাম = মান রয়েছে; নামগুলিতে '=' অক্ষর থাকবে না। আইইইই স্ট্যান্ড 1003.1-2001 অনুসারে সিস্টেমগুলিতে মানগুলি পোর্টেবল হওয়ার জন্য, মানটি পোর্টেবল অক্ষর সেট থেকে অক্ষর দ্বারা গঠিত হবে (NUL ব্যতীত এবং নীচে নির্দেশিত হিসাবে )।

সুতরাং নামগুলিতে = এবং NUL ব্যতীত অন্য কোনও অক্ষর থাকতে পারে তবে:

আইইইই স্ট্যান্ড 1003.1-2001 এর শেল এবং ইউটিলিটিস ভলিউমে ইউটিলিটিগুলির দ্বারা ব্যবহৃত পরিবেশগত পরিবর্তনশীল নামগুলি কেবল পোর্টেবল ক্যারেক্টার সেটে বর্ণিত অক্ষরগুলি থেকে বড় হাতের অক্ষর, অঙ্কগুলি এবং '_' (আন্ডারস্কোর) নিয়ে গঠিত হয় এবং কোনও অঙ্ক দিয়ে শুরু হয় না । অন্যান্য অক্ষরগুলি প্রয়োগের মাধ্যমে অনুমোদিত হতে পারে; অ্যাপ্লিকেশনগুলি এই জাতীয় নামের উপস্থিতি সহ্য করবে।

সুতরাং নামগুলি বৈধ হতে পারে, আপনার শেল অক্ষর, সংখ্যা এবং আন্ডারস্কোর ছাড়াও অন্য কোনও কিছুকে সমর্থন করতে পারে না।


8
শুধু যাচাই করা হচ্ছে: দ্বিতীয় উদ্ধৃতিটি অ-আদর্শিক: এটি কেবল পর্যবেক্ষণ করেছে যে [a-zA-Z_][a-zA-Z0-9_]*পসিক্স তার প্রয়োজনীয়তাগুলির জন্য বিশেষরূপে যে পরিবর্তনশীলগুলি সংজ্ঞায়িত করেছে তা হ'ল (স্পষ্টভাবে এই ফর্মটি স্যানার বলে বোঝানো হচ্ছে), তবে প্রকৃত বৈশিষ্ট (উদ্ধৃতি 1) এর জন্য কিছু কার্যকর করার জন্য সমস্ত প্রয়োগ প্রয়োজন= এবং NUL?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

3
এছাড়াও, "পোর্টেবল ক্যারেক্টার সেট" pubs.opengroup.org/onlinepubs/000095399/basedefs/… তে ফাঁকা স্থান এবং অন- প্রিন্টেবলের মতো জিনিস রয়েছে: তাই আমরা কি এই জিনিসগুলি ব্যবহার করতে পারি না?
সিওরো সান্তিলি :19 冠状 病 六四 事件

3
এটি আমি অবলোকন করি। ভেরিয়েবল নামের অংশ হিসাবে শেল বিশেষ অক্ষর পছন্দ করে না। তবে যখন কোনও প্রোগ্রাম বা স্ক্রিপ্ট (উদাহরণস্বরূপ জাভা বা পার্ল) তার নামে বিশেষ অক্ষর সহ একটি পরিবর্তনশীল সূচনা করে এবং অন্য নির্বাহী (একটি শিশু প্রক্রিয়া) ডেকে আখ্যায়িত করা হয় পরে সম্পাদনযোগ্য কোনও সমস্যা ছাড়াই সেই পরিবর্তনশীল অ্যাক্সেস করতে পারে।
oᴉɹǝɥɔ

1
@ চেকসাম, UPPERCASE স্পষ্টভাবে শেল সহ POSIX- নির্দিষ্ট সরঞ্জামগুলির অর্থ সহ ভেরিয়েবল নামের জন্য নির্দিষ্টভাবে নির্দিষ্ট করা হয়েছে; কমপক্ষে একটি ছোট-ছোট অক্ষরযুক্ত নামগুলি প্রয়োগের জন্য স্পষ্টভাবে সংরক্ষিত। সুতরাং, সেরা অনুশীলনটি হ'ল আপনার অ্যাপ্লিকেশনগুলির পরিবর্তনশীল নামগুলিতে কমপক্ষে একটি ছোট-ছোট অক্ষর অন্তর্ভুক্ত করা নিশ্চিত করতে আপনি অনিচ্ছাকৃতভাবে ওভাররাইট করছেন না (শেল ভেরিয়েবল নির্ধারণের সাথে কোনও যেমন-জাতীয় পরিবেশের ভেরিয়েবলকে ওভাররাইট করতে হবে) এর সাথে একটি ভেরিয়েবলের অর্থ রয়েছে পদ্ধতি. Pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
চার্লস ডাফি

2
@CiroSantilli 事件 事件 2016 六四 事件 法轮功, আপনি এটিকে পরিবেশের পরিবর্তনশীলগুলিতে ব্যবহার করতে পারেন; আপনি এগুলি শেল ভেরিয়েবলগুলিতে ব্যবহার পারবেন না এবং সেই পরিবেশের ভেরিয়েবলগুলি শেল থেকে অ্যাক্সেসযোগ্য হওয়ার নিশ্চয়তা নেই।
চার্লস ডাফি

37

আইইইইএস স্ট্যান্ড 1003.1-2008 / আইইইই পসিক্স পি 1003.2 / আইএসও 9945.2 শেল এবং সরঞ্জামগুলির শেল বিভাগে পজিক্স মানগুলি চলক নামের জন্য লেজিকাল কনভেনশনটিকে সংজ্ঞায়িত করে না, তবে উত্সটিতে একটি কারসারি চেহারা প্রকাশ করে যে এটি এর অনুরূপ কিছু ব্যবহার করে

[a-zA-Z_]+[a-zA-Z0-9_]*

(সম্পাদনা করুন: ২ য় চরিত্রের শ্রেণিতে নিখোঁজ আন্ডারস্কোর)

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

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}


4
ধন্যবাদ, আইডেন আমি মনে করি বর্গাকার বন্ধনীগুলির দ্বিতীয় সেটটিতে একটি আন্ডারস্কোর অনুপস্থিত রয়েছে: এটি সম্ভবত পড়তে হবে: [a-zA-Z_][a-zA-Z0-9_]* আমার মতো যারা বাশ -২.১ এর সামান্য অস্পষ্টতা (কোডের 6১16'০০০ লাইন) রেফারেন্স খুঁজে পান, এখানে কয়েকটি ইঙ্গিত দেওয়া হল কোডের প্রাসঙ্গিক লাইনগুলি সন্ধান করুন: subst.c: param_expand(), in the default case-> general.h:/ * কোনও আইনী শেল শনাক্তকারীকে ঠিক কী অন্তর্ভুক্ত করে তা নির্ধারণ করুন। * / # নির্ধারিত আইনী_পরিবর্তনীয়_মালা (গ) (ইসালফা (সি) || (সি == ' ')) # নির্ধারিত আইনী_ভরিয়াল_চর (সি) (ইসালনুম (সি) || সি == ' ')
ক্রিস

3
প্রথম অক্ষর শ্রেণিতে আপনার প্লাসের দরকার নেই।
স্ক্র্যাভি

2
সত্য @scravy, যদিও আমি উৎস থেকে regexp নেন তাই আমি রাখা করত + + আছি।
লেসবিয়ান বেল

4
পসিক্স সংজ্ঞা দেয়: 3.231 নামa word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit

শেল বিভাগে নয়, তবে একেবারে পসিক্স মান রয়েছে যা পরিবেশগত পরিবর্তনশীল নামকরণের জন্য সম্মেলনগুলি অন্তর্ভুক্ত করে (এবং আসলে শেল ব্যবহারের জন্য সংরক্ষিত নামগুলি নিয়ে আলোচনা করে)। Pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
চার্লস ডাফি

12

আমার দ্রুত পরীক্ষায় দেখা গেছে যে তারা মূলত সি ভেরিয়েবলের নামগুলি যেমন একই নিয়মগুলি অনুসরণ করে

  1. আজ, এজেড, _ এবং 0-9
  2. একটি নম্বর দিয়ে শুরু হতে পারে না

সুতরাং এটি .তাদের ভিতরে বাদ দেয় । যে কোনও অবৈধ ভেরিয়েবলের নাম জমা হয়unknown command

এটি জেডএসএইচে পরীক্ষা করা হয়েছিল, যা বেশিরভাগই বেস-সামঞ্জস্যপূর্ণ।


6

আপনি 'অনুমোদিত' বলতে কী বোঝাতে চান তার উপর নির্ভর করে।

ননসের জন্য উইন্ডোজ উপেক্ষা:

এনভায়রনমেন্ট স্ট্রিংগুলির একটি অ্যারে যা কোনও প্রোগ্রামের মূল ফাংশনে চলে আসে। আপনি যদি এক্সিকিউড (2) পড়ে থাকেন তবে নাল-সমাপ্তি ব্যতীত আপনি এই স্ট্রিংগুলির কোনও প্রয়োজন বা সীমাবদ্ধতা দেখতে পাবেন না।

কনভেনশন অনুসারে, প্রতিটি স্ট্রিংয়ের মধ্যে NAME = মান থাকে। কোনও উদ্ধৃতি সম্মেলন নেই, সুতরাং আপনার এই সম্মেলনে নামে একটি '=' থাকতে পারে না।

সাধারণ মানুষ তাদের খোল নিয়ে আলোচনা করে এই স্ট্রিংগুলি সেট করে। প্রতিটি শেলের বৈধ পরিবর্তনশীল NAME কী কী তার নিজস্ব ধারণাগুলি রয়েছে, তাই আপনাকে কী মনে করে তা দেখার জন্য আপনাকে মুহুর্তের শেল অফ দ্য ম্যান পৃষ্ঠাটি পড়তে হবে।

সাধারণত, com.baseball.spit = fleagh এর মতো জিনিসগুলি জাভা সিস্টেমের বৈশিষ্ট্য এবং কিছু জাভা প্রোগ্রাম পরিবেশে ফিরে আসতে ইচ্ছুক বা না, সেগুলি ডি-ডি দ্বারা নির্দিষ্ট করা আরও ভাল।


আমার আগে এই সিদ্ধান্তে উপনীত হওয়া উচিত ছিল যে ভেরিয়েবলটি পরিবেশ পরিবর্তনশীল হিসাবে সেট করার চেষ্টা না করে একটি জাভা সিস্টেম বৈশিষ্ট্যের মতো ফর্ম্যাট করা হয়েছে।
খ্রিস্টান সেমরাউ

5

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


4

হ্যাঁ, আপনি এটা করতে পারেন.

ব্যবহারের execএবং envকমান্ড এই দৃশ্য বাস্তবায়ন।

ডকারে পরীক্ষার স্থিরতা

docker run -it --rm alpine:3.10

পাত্রে কমান্ড চালান:

exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}

পরিবেশের ভেরিয়েবল যাচাই করুন:

HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

ps auxপিআইডি যাচাই করতে ব্যবহার করা হয়নি

PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
   12 root      0:00 ps aux

pythonপরিবেশগত পরিবর্তনশীল যাচাই করতে ব্যবহার করুন verify

apk add python
python -c 'import os; print(os.environ["spring.application_name"])'

আউটপুট হয় happy-variable-name

কি হল?

  1. শেল কল বিল্ট ইন এক্সেক
  2. শেল বিল্টইন এক্সিকিউশন কল করে সিস্কেল.এক্সেক বর্তমান শেলটি প্রতিস্থাপন করতে প্রক্রিয়া তৈরি করে 'এনভিভি'
  3. env প্রক্রিয়া কল করুন syscall.execvp env প্রক্রিয়া প্রতিস্থাপন করতে প্রক্রিয়া '/ বিন / শ' তৈরি করুন

অন্য উপায়

  • ডকার ইমেজ

আপনি যদি ডকার ব্যবহার করছেন, আপনি ডকফাইফিলে পরিবর্তনশীল সেট করতে পারেন

FROM busybox
ENV xx.f%^&*()$#ff=1234
  • কুবেরনেটস কনফিগারেশন

আপনি যদি কুবারনেট ব্যবহার করছেন তবে আপনি কনফিগারেশন দ্বারা পরিবর্তনশীল সেট করতে পারেন

test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-config
data:
  "xx.ff-bar": "1234"

---
apiVersion: v1
kind: Pod
metadata:
  name: foobar
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: foo-config
  restartPolicy: Never

পোড স্থাপন করুন kubectl apply -f test.yaml

kubectl logs foobarআউটপুট যাচাই করুন :

xx.ff-bar=1234

কনফিগারেশন ম্যাপ '-', '_' বা 'অনুমতি দেয়।


0

যদিও বেশিরভাগ শেলটি এনভায়ারোমেন্ট ভেরিয়েবলগুলি সেট করতে দেয় না (যেমন অন্যান্য উত্তরগুলিতে উল্লিখিত হয়েছে), আপনার যদি প্রয়োজন হয় তবে আপনি নন-স্ট্যান্ডার্ড এনভায়ারওমেন্ট ভেরিয়েবলগুলি ব্যবহার করে অন্যান্য প্রোগ্রামগুলি চালিয়ে যেতে পারেন env(1)

উদাহরণস্বরূপ, সমস্ত পরিবেশ মুছে ফেলা এবং Strange.Env:Varমানকে সেট করা foo, এবং এটি প্রিন্ট করা পার্ল প্রোগ্রামটি চালানো:

env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'

মুদ্রণ করবে

$VAR1 = {
          'Strange.Env:Var' => 'foo'
        };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.