Vর্ষা করা বা না করা vর্ষা করা


32

কমান্ডের মধ্যে পার্থক্য কি

$ env FOO=bar baz

এবং

$ FOO=bar baz

কি প্রভাব envআছে?


4
পাশের প্রশ্নের সাজান, তবে আপনি যখন এমন একক সাবকম্যান্ডের জন্য পরিবেশের পরিবর্তনশীল সেট করেন তখন বৈশিষ্ট্যটিকে কী বলা হয়? আমি সর্বদা এ সম্পর্কে তথ্য সন্ধান করা একটি কঠিন সময় ছিল কারণ আমি জানি না এটি কী বলে।
জন ক্রোমার্টি

1
@ জন ক্রোমার্টি, আপনার এটি প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত।
সিজেএম


2
@ জনক্রোমার্টি এটি প্রতিটি শেল কমান্ডের একটি componentচ্ছিক উপাদান, তাই এটি বেশিরভাগ শেল ম্যানুয়ালগুলির "সিম্পল কমান্ডগুলি" বিভাগে রয়েছে। পসিক্সের জন্য, এটি এখানেই থাকবে । গ্লেন ইতিমধ্যে আপনার জন্য ব্যাশ ম্যানুয়াল থেকে সাদৃশ্য বিভাগটি যুক্ত করেছে।
jw013

একটি অ্যাসাইনমেন্টের মাধ্যমে অস্তিত্ব নেই এমন একটি ভেরিয়েবল সেট করা শেল ভেরিয়েবল তৈরি করে। এটিভের মাধ্যমে সেট করা বা ভেরিয়েবলটি রফতানি করে ভেরিয়েবলটিকে শেলের কার্যকর পরিবেশে ঠেলে দেয়। বিদ্যমান ভেরিয়েবলের মান পরিবর্তন করা যদি উপস্থিত থাকে তবে এক্সিকিউশন পরিবেশের মান আপডেট করে, অন্যথায় এটি শেল অভ্যন্তরীণ ভেরিয়েবলগুলিতে পরিবর্তন করে।
জোহান

উত্তর:


26

তারা কার্যত সমতুল্য।

মূল পার্থক্যটি হ'ল 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, এবং পুরোপুরি বৈধ।


1
আপনি FOO=bar exec bazযদিও এটি করতে পারেন , তাই envআপনার শেষ পয়েন্টে আপনার দরকার নেই ।
স্টাফেন চেজেলাস

আপনি execকিছু যখন , এটি আপনার বর্তমান পরিবেশ ব্যবহার করে?
গ্লেন জ্যাকম্যান

1
ডিট্টো @ স্টেফেনচাজেলাস এবং আপনি sudo FOO=bar bazপ্রয়োজন ছাড়াই পরিবেশের ভেরিয়েবলগুলিও পাস করতে পারেন env
মাইক মিলার

1
@ স্টিফেনচাজেলাস কেবলমাত্র যদি আমি FOO=barস্ক্রিপ্টে রাখতে চাই তবে কাজ করে। যদি FOOসবসময় নয় bar, আমি না হার্ড এটা কোড করতে চান, এবং পরিবর্তে এটা পাস।
প্যাট্রিক

@glennjackman হ্যাঁ এটি করে, যতক্ষণ না ভেরিয়েবলগুলি রফতানি করা হয় বা এর আগে execযেমন পাস করা হয় FOO=bar exec baz
প্যাট্রিক

14

এই বিশেষ উদাহরণে, কোনও কার্যকর পার্থক্য নেই, ধরে নিলে আপনার শেলটি একটি পসিক্স-সামঞ্জস্যপূর্ণ শেল, এবং ধরে 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)সমান ফাংশনটি লিখতে লিখতাম।
বর্মার

6

ইতিমধ্যে যা বলা হয়েছে তা ছাড়াও

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এখনও পরিবেশের পরিবর্তনশীল স্ট্রিংটি পাস করতে পারবেন না যার মধ্যে একটি নেই =(এটি নয় যে আপনি এটি করতে চান)।


2

এর একটি ব্যবহার envহ'ল $PATHশিবাং লাইনে এক্সিকিউটেবলের সন্ধানের অনুমতি দেওয়া (কারণ নির্বাহীর জন্য অনুসন্ধানের সময় envবিবেচনা করে $PATH)। আপনি কার্যকর করতে চান এক্সিকিউটেবল বিভিন্ন মেশিনে বিভিন্ন স্থানে থাকতে পারে যদি এটি দরকারী। উদাহরণ স্বরূপ,

#!/usr/bin/env perl

এক্সিকিউটেবল বিট সেট সহ স্ক্রিপ্টের প্রথম লাইনে এই স্ক্রিপ্টটি পার্লের সাথে চালানো হবে যতক্ষণ না ডিরেক্টরিটি চলছে ততক্ষণ এটি ইনস্টল করা আছে /usr/bin/perlবা /usr/local/bin/perlপুরোপুরি ভিন্ন জায়গায় ইনস্টল করা আছে ।

অবশ্যই সেই পথ অনুসন্ধানটি একটি অতিরিক্ত ঝুঁকি নিয়ে আসে, তবে তারপরে, আপনি স্পষ্টভাবে লিখেছিলেন তবে ঝুঁকিটি বড় নয় perl yourscript.pl, যা অনুসন্ধানের পথেও পার্ল দেখায়।


2

আপনি যখন 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একটি খালি মান সেট করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.