প্রশ্ন মান / ইন / পরিবেশে মান পরিবর্তনশীল (হ্যাশ) মান সহ মান পরিবর্তনশীল


উবুন্টু 1২.04 তে আমার একটি পরিবেশগত পরিবর্তনশীল সংজ্ঞায়িত আছে /etc/environment এটার মত:

FOO="value_before#value_after"

যখন আমি মান চেক করার জন্য সার্ভারে ssh, আমি এই পেতে:

$ env | grep FOO
FOO=value_before

আমি এটা চিকিত্সা করা হয় অনুমান করছি # একটি মন্তব্য হিসাবে এবং এটি stripping আউট, যাইহোক, এই কাজ করে:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

আমি পালানোর চেষ্টা করেছি # এটার মত:

FOO="value_before\#value_after"

কিন্তু যে কাজ করে না, পরিবর্তে আমি শুধু এই পেতে:

FOO=value_before\

হ্যাশ কীভাবে তৈরি করা যায় তার কোন ধারনা মূল্যের অংশ হিসাবে গণ্য হবে? যেকোনো সাহায্যই অসাধারণ.

মান আমি চেষ্টা করেছি /etc/environment ফাইল:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

এবং উপরে অন্যান্য বিভিন্ন সমন্বয়। আপনি সাধারণত সাধারণভাবে শেল সেট যখন এই অনেক কাজ করবে। কিন্তু তারা কাজ বলে মনে হচ্ছে না /etc/environment ফাইল।


8
2017-09-18 00:11


উত্স




উত্তর:


এই pam_env মডিউল দ্বারা পড়া হয়। Pam_env মডিউল তাদের "সহজ" KEY = VALUE জোড়া (কোটগুলির প্রয়োজন নেই) এবং # দ্বারা সনাক্ত হওয়া মন্তব্যগুলিকে সমর্থন করে বলে মনে করে, এটি একটি # এবং VALUE এ এটি অনুসরণ করে এমন কোনও মন্তব্য একটি মন্তব্য। এছাড়াও, এটি escaping কোন ধারণা সমর্থন করে না যে নোট করুন।

নিম্নোক্ত স্নিপেটে এটি _parse_env_file ফাংশন থেকে দেখা যেতে পারে pam_env.c

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';

উপরের স্নিপেটটি VALUE অংশের প্রতিটি চরিত্রটি এটি না হওয়া পর্যন্ত হাঁটবে \n, # অথবা \0। এটি একটি সঙ্গে যে চরিত্র overwrites \0

এই কার্যকরভাবে বন্ধ আঁকা # এবং সবকিছু অনুসরণ। বিঃদ্রঃ: এটি একটি বৈশিষ্ট্য না একটি বাগ. এটি মন্তব্য বৈশিষ্ট্য।

সুতরাং, এই সময়ে আপনি মান থাকতে পারে না /etc/environment যে একটি অন্তর্ভুক্ত # অথবা একটি \n অথবা \0 মান মাঝখানে। এটি এমন কোড থেকেও দেখায় যা কীগুলি আলফা-সংখ্যাসূচক হতে হবে।


5
2017-09-17 19:28



ওহ, এটা নকল! বিস্তারিত ব্যাখ্যা করার জন্য ধন্যবাদ, আমি এটি গ্রহণযোগ্য সমাধান হিসাবে চিহ্নিত করেছি। - Jaymon


আমি এই সীমাবদ্ধতা কাছাকাছি একটি উপায় খুঁজে পেতে সক্ষম ছিল না /etc/environment, ডকুমেন্টেশন যে রাষ্ট্র বলে মনে হচ্ছে /etc/environment ইহা একটি সহজ পরিবেশ ফাইল:

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

যার অর্থ আপনি এটি উদ্ধৃতি ব্যবহার করে মান বাড়াতে দেয় না \ চরিত্র, অন্যান্য জায়গায় সত্ত্বেও ডকুমেন্টেশন সম্ভবত এই সম্ভব বলছে:

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

হয়তো বা না:

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

যাইহোক, এই সীমাবদ্ধতা কাছাকাছি পেতে, আমি আমার গ্লোবাল পরিবেশ ভেরিয়েবল একটি ফাইল মধ্যে সরানো /etc/profile.d যেমন এই উত্তর আলোচনা। আমি এখনও এই প্রশ্নের উত্তর না বিবেচনা, কিন্তু আমি জন্মতারিষ্ঠ জন্য একটি লিঙ্ক workaround ছিল তা নিশ্চিত করতে চেয়েছিলেন।


2
2017-09-20 00:36





# (এটি একটি মন্তব্য হিসেবে বিবেচিত) থেকে পালাতে / etc / পরিবেশে কোন উপায় নেই কারণ এটি PAM মডিউল "pam_env" দ্বারা বিশ্লেষণ করা হচ্ছে এবং এটি KEY = VAL জোড়াগুলির একটি সহজ তালিকা হিসাবে আচরণ করে এবং সেট আপ করে পরিবেশ অনুযায়ী। এটি বাশ / শেল নয়, পার্সারের পরিবর্তনশীল বিস্তার বা অক্ষরগুলি পালানোর জন্য কোন ভাষা নেই।


1
2017-09-20 00:52





একক উদ্ধৃতি।

$ FOO='foo#bar'
$ echo $FOO
foo#bar

0
2017-09-18 00:15



যে প্রথম চেষ্টা আমি চেষ্টা করেছি, এটি শেলের কাজ করে, দুঃখজনকভাবে, এটি কাজ করে না /etc/environment, আমি চেষ্টা করেছি মানগুলির কিছু উদাহরণ দিয়ে আমার প্রশ্ন আপডেট করেছি। - Jaymon