কমান্ডের মধ্যে পার্থক্য কি
$ env FOO=bar baz
এবং
$ FOO=bar baz
কি প্রভাব envআছে?
কমান্ডের মধ্যে পার্থক্য কি
$ env FOO=bar baz
এবং
$ FOO=bar baz
কি প্রভাব envআছে?
উত্তর:
তারা কার্যত সমতুল্য।
মূল পার্থক্যটি হ'ল env FOO=bar bazশেল এবং bazযেখানে FOO=bar bazশেলটি সরাসরি অনুরোধ করে তার মধ্যে মধ্যবর্তী প্রক্রিয়া শুরু করে baz।
সুতরাং যে ক্ষেত্রে, FOO=bar bazঅগ্রাধিকার দেওয়া হয়।
আমি নিজেকে কেবল env FOO=barকমান্ডটি অন্য কমান্ডের মধ্যে দিয়ে যেতে হয় যেখানে আমি নিজেকে ব্যবহার করতে দেখি।
সুনির্দিষ্ট উদাহরণ হিসাবে ধরা যাক, আমার কাছে একটি মোড়ক স্ক্রিপ্ট রয়েছে যা পরিবেশের কিছু পরিবর্তন সম্পাদন করে এবং তারপরে execযে আদেশটি প্রেরণ করা হয়েছিল তাকে কল করে যেমন:
#!/bin/bash
FOO=bob
some stuff
exec "$@"
যদি আপনি শব্দটি চালানো হলে myscript FOO=bar baz, execএকটি ত্রুটি নিক্ষেপ করা হবে যেমন exec FOO=bar bazঅবৈধ।
পরিবর্তে আপনি এটি হিসাবে ডেকে myscript env FOO=bar bazযা হিসাবে হিসাবে ডাকা হয় exec env FOO=bar baz, এবং পুরোপুরি বৈধ।
FOO=bar exec bazযদিও এটি করতে পারেন , তাই envআপনার শেষ পয়েন্টে আপনার দরকার নেই ।
execকিছু যখন , এটি আপনার বর্তমান পরিবেশ ব্যবহার করে?
sudo FOO=bar bazপ্রয়োজন ছাড়াই পরিবেশের ভেরিয়েবলগুলিও পাস করতে পারেন env।
FOO=barস্ক্রিপ্টে রাখতে চাই তবে কাজ করে। যদি FOOসবসময় নয় bar, আমি না হার্ড এটা কোড করতে চান, এবং পরিবর্তে এটা পাস।
execযেমন পাস করা হয় FOO=bar exec baz।
এই বিশেষ উদাহরণে, কোনও কার্যকর পার্থক্য নেই, ধরে নিলে আপনার শেলটি একটি পসিক্স-সামঞ্জস্যপূর্ণ শেল, এবং ধরে bazনেওয়া একটি নির্বাহযোগ্য এবং শেল বিল্টিন নয়।
আপনার শেল হয়, তাহলে না একটি POSIX সামঞ্জস্যপূর্ণ শেল, উদাহরণস্বরূপ cshবা tcsh, সিনট্যাক্স
FOO=bar baz
কাজ করে না, এবং সমান শেল সিনট্যাক্স নেই। এই শেলগুলির জন্য, envকমান্ডটি একক কমান্ডের জন্য পরিবেশের ভেরিয়েবলকে ওভাররাইড বা ইনজেক্ট করার একমাত্র উপায়।
যদি bazএকটি শেল অন্তর্নির্মিত হয়, fcউদাহরণস্বরূপ বলা যাক , তবে envএকই ফলাফলগুলি দেবে না, কারণ envকমান্ড শেল দ্বারা সরাসরি চালানোর পরিবর্তে একটি নতুন প্রক্রিয়া চালানো হচ্ছে। তাছাড়া সেখানে নেই fcএক্সিকিউটেবল, এটি শুধুমাত্র কারণ উপায় এটি শেল পরিবেশের সঙ্গে মিথস্ক্রিয়া একটি শেল builtin হিসাবে চালানো যাবে না, এবং তাই envহবে না মত একটি builtin সঙ্গে কাজ fc।
এছাড়াও, বিকল্পটি envউপলব্ধ করে -i, যা আপনাকে কেবলমাত্র পরিবেশের ভেরিয়েবলগুলির একটি নির্দিষ্ট সেট সহ খালি পরিবেশে একটি কমান্ড শুরু করতে দেয়। সুতরাং envউদাহরণস্বরূপ, sanitized পরিবেশের মধ্যে প্রসেস শুরু করার জন্য খুবই উপযোগী হতে পারে
env -i HOME=/tmp/homedir "PATH=`getconf PATH`" "TERM=$TERM" FOO=bar baz
tcshকরতাম তখন আমি (setenv FOO bar; baz)সমান ফাংশনটি লিখতে লিখতাম।
ইতিমধ্যে যা বলা হয়েছে তা ছাড়াও
VAR=value cmd args > redirs
শেল (বোর্ন / পসিক্স) বৈশিষ্ট্য হওয়ায় আপনি যে পরিবেশের ভেরিয়েবলের কাছে সীমাবদ্ধ তা সীমাবদ্ধ cmd। এগুলি বৈধ শেল ভেরিয়েবলের নাম হতে হবে এবং কেবল শেলটিতে কেবল পঠনযোগ্য বা বিশেষ ভেরিয়েবলের হবে না।
উদাহরণস্বরূপ, আপনি এটি করতে পারবেন না:
1=foo cmd
অথবা
+++=bar cmd
bash আপনাকে করতে দেয় না:
SHELLOPTS=xtrace cmd
আপনি যখন করতে পারেন:
env 1=foo cmd
env +++=bar cmd
env '=baz' cmd
(এমনটি নয় যে আপনি চান বা এটি করতে চান)। বা:
env SHELLOPTS=xtrace cmd
(আমার মাঝে মাঝে এটি করা দরকার)।
নোট করুন যে আপনার সাথে envএখনও পরিবেশের পরিবর্তনশীল স্ট্রিংটি পাস করতে পারবেন না যার মধ্যে একটি নেই =(এটি নয় যে আপনি এটি করতে চান)।
এর একটি ব্যবহার envহ'ল $PATHশিবাং লাইনে এক্সিকিউটেবলের সন্ধানের অনুমতি দেওয়া (কারণ নির্বাহীর জন্য অনুসন্ধানের সময় envবিবেচনা করে $PATH)। আপনি কার্যকর করতে চান এক্সিকিউটেবল বিভিন্ন মেশিনে বিভিন্ন স্থানে থাকতে পারে যদি এটি দরকারী। উদাহরণ স্বরূপ,
#!/usr/bin/env perl
এক্সিকিউটেবল বিট সেট সহ স্ক্রিপ্টের প্রথম লাইনে এই স্ক্রিপ্টটি পার্লের সাথে চালানো হবে যতক্ষণ না ডিরেক্টরিটি চলছে ততক্ষণ এটি ইনস্টল করা আছে /usr/bin/perlবা /usr/local/bin/perlপুরোপুরি ভিন্ন জায়গায় ইনস্টল করা আছে ।
অবশ্যই সেই পথ অনুসন্ধানটি একটি অতিরিক্ত ঝুঁকি নিয়ে আসে, তবে তারপরে, আপনি স্পষ্টভাবে লিখেছিলেন তবে ঝুঁকিটি বড় নয় perl yourscript.pl, যা অনুসন্ধানের পথেও পার্ল দেখায়।
আপনি যখন envপরিবেশকে পুরোপুরি নিয়ন্ত্রণ করতে চান তবে অন্য সময় যখন সত্যিই দরকারী is আমি একটি সার্ভার প্রোগ্রাম চালিত করি (ইনফর্মিক্স, আপনি যদি অনুমান করতে না পারেন) যার পরিবেশে আমি সম্পূর্ণরূপে নিয়ন্ত্রণ করতে চাই। আমি এটি envএকটি স্ক্রিপ্টের শেষে ব্যবহার করে চালিত করি যা সঠিক মানগুলিতে ভেরিয়েবলগুলির একগুচ্ছ সেট করে:
env -i HOME="$IXD" \
INFORMIXDIR="$IXD" \
INFORMIXSERVER="$IXS" \
${IXC:+INFORMIXCONCSMCFG="$IXC"} \
${IXH:+INFORMIXSQLHOSTS="$IXH"} \
IFX_LISTEN_TIMEOUT=3 \
ONCONFIG="onconfig.$IXS" \
PATH="/bin:/usr/bin:$IXD/bin" \
SHELL=/bin/ksh \
TZ=UTC0 \
$ONINIT "$@"
-iবিকল্প বিদ্যমান পরিবেশ zaps। পরবর্তী VAR=valueবিকল্পগুলি পরিবেশ পরিবর্তনশীল সেট করে যা আমি সেট করতে চাই; প্রোগ্রামটির নামটি রয়েছে $ONINITএবং যে কোনও কমান্ড লাইন আর্গুমেন্টটি ভারব্যাটিম দিয়ে পাস করা হয় "$@"।
${IXH:+INFORMIXSQLHOSTS="$IXH"}কনস্ট্রাক্ট শুধুমাত্র পাসের INFORMIXSQLHOSTS="$IXH"জন্য envযদি $IXHএকটি খালি মান সেট করা হয়।