পরিবেশের ভেরিয়েবলগুলি সেট করতে আমি কেন একটি কমান্ডের উপসর্গ হিসাবে চলকগুলি ব্যবহার করতে পারি না?


11

সাধারণত, কমান্ডের মতো প্রাক-উপস্থাপন করে পরিবেশের পরিবর্তনশীল সেট করা সম্ভব:

hello=hi bash -c 'echo $hello'

আমি আরও জানি যে আমরা একটি ভেরিয়েবল ব্যবহার করে নিম্নলিখিত কমান্ডের অনুরোধের যে কোনও অংশকে বিকল্প হিসাবে ব্যবহার করতে পারি:

$ cmd=bash
$ $cmd -c "echo hi" # equivalent to bash -c "echo hi"

আমি খুব অবাক হয়ে জানতে পেরেছিলাম যে আপনি একটি পরিবেশের ভেরিয়েবল সেট করতে একটি কমান্ডের উপসর্গ করতে একটি পরিবর্তনশীল ব্যবহার করতে পারবেন না। পরীক্ষা ক্ষেত্রে:

$ prefix=hello=hi
$ echo $prefix # prints hello=hi
$ $prefix bash -c 'echo $hello'
hello=hi: command not found

আমি কেন একটি ভেরিয়েবল ব্যবহার করে পরিবেশের পরিবর্তনশীল সেট করতে পারি না? উপসর্গটি একটি বিশেষ অংশ? আমি সামনে ইওল ব্যবহার করে এটি কাজ করতে সক্ষম হয়েছি, তবে কেন এখনও তা বুঝতে পারছি না। আমি ব্যাশ ব্যবহার করছি 4.4।


1
আপনি এর envপরিবর্তে ব্যবহার করতে পারেন eval, যা আইআইআরসি আরও সুরক্ষিত তবে ধীর।
wjandrea

উত্তর:


14

আমি সন্দেহ করি এটি যে ক্রমটি আপনাকে ধরেছে এটির একটি অংশ:

পরিবর্তনশীল অ্যাসাইনমেন্ট বা পুনঃনির্দেশ নয় এমন শব্দগুলি প্রসারিত হয় (শেল সম্প্রসারণ দেখুন)। যদি কোনও শব্দ প্রসারণের পরে থেকে যায় তবে প্রথম শব্দটি আদেশের নাম হিসাবে নেওয়া হয় এবং বাকী শব্দগুলি আর্গুমেন্ট

থেকে যে ব্যাশ সহায়িকা সহজ কমান্ড সম্প্রসারণ বিভাগে হবে।

ইন cmd=bashউদাহরণস্বরূপ, কোন এনভায়রনমেন্ট ভেরিয়েবল নির্ধারণ করা হয়, এবং ব্যাশ প্যারামিটার সম্প্রসারণের মাধ্যমে কমান্ড লাইন আপ প্রক্রিয়া, যাব bash -c "echo hi"

ইন prefix=hello=hiউদাহরণস্বরূপ, আবার সেখানে প্রথম পাস কোন পরিবর্তনশীল বরাদ্দকরণ, তাই প্রক্রিয়াকরণ, পরামিতি সম্প্রসারণ অব্যাহত প্রথম শব্দ ফলে হয় hello=hi

একবার ভেরিয়েবল অ্যাসাইনমেন্টগুলি প্রক্রিয়া করা হয়ে গেলে, কমান্ড কার্যকর করার সময় সেগুলি পুনরায় প্রক্রিয়া করা হয় না।

প্রক্রিয়াজাতকরণ এবং এর ফলাফলগুলি এর অধীনে দেখুন set -x:

$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

"পরিবর্তনশীল সম্প্রসারণ" - "পরিবেশের ভেরিয়েবল" এর চেয়ে নিরাপদ পরিবর্তনের জন্য ওজান্দ্রিয়া এর পরামর্শeval বিবেচনা করুন :env

prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

এটি কমান্ড-লাইন ভেরিয়েবল অ্যাসাইনমেন্টটি কঠোরভাবে নয়, যেহেতু আমরা envএকটি কমান্ডের জন্য পরিবেশের ভেরিয়েবলগুলি নির্ধারণের জন্য ইউটিলিটির মূল ফাংশনটি ব্যবহার করছি , তবে এটি একই লক্ষ্য অর্জন করে। $prefixপরিবর্তনশীল কম্যান্ড-লাইন প্রক্রিয়াকরণের সময় প্রসারিত করা হয়, নাম = মান প্রদানের env, যিনি এটি বরাবর প্রেরণ করা হয় bash


3
একইভাবে, $foo=bar bash -c ...কাজ করবে না, কারণ $foo=barভেরিয়েবল অ্যাসাইনমেন্টের (যে কোনও মানই হোক $foo) নয়, কারণ ভেরিয়েবল অ্যাসাইনমেন্টের জন্য প্যাটার্ন $foo=barফিট করে না name=value
মুরু

3

কারণ $prefixএকটি কাজ নয়। @ জেফের দীর্ঘতর ব্যাখ্যা রয়েছে

পরিবর্তে আপনি একটি ফাংশন দিয়ে একই জিনিস করতে পারে:

$ prefix() { hello=hi "$@"; }
$ prefix bash -c 'echo "$hello"'
hi

... এবং আপনি এগুলি এমনকি স্ট্যাক করতে পারেন, যদি আপনি চান:

$ foo() { foo=123 "$@"; }
$ bar() { bar=456 "$@"; }
$ foo bar bash -c 'echo "$bar $foo"'
456 123
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.