কোনও কমান্ডে নাম-মান-জুটি প্রস্তাব এবং ব্যাশ-এ এনভির ব্যবহারের মধ্যে পার্থক্য রয়েছে কি?


19

যাক আমি প্রার্থনা করি A=B commandএবং env A=B commandভিতরে প্রবেশ করি bash। উভয় আহ্বানের মধ্যে পার্থক্য থাকতে পারে এমন কোনও পরিস্থিতি কি আছে?

উত্তর:


26

তারা একই উদ্দেশ্যে পরিবেশন করে (প্রদত্ত এনভ বারগুলি কমান্ডে পাস করুন)। তবে কয়েকটি উল্লেখযোগ্য পার্থক্য:

A=B command

হ'ল শেল (বোর্ন / পসিক্স / আরসি) কনস্ট্রাক্ট।

উদাহরণস্বরূপ, আপনি এটি করতে পারেন:

A=B find . -exec cmd '{}' +

বা:

find . -exec env A=B cmd '{}' +

তবে আপনি পারবেন না:

find . -exec A=B cmd '{}' +

কারণ findএই কমান্ডটি চালানোর জন্য কোনও শেলকে ডাকে না।

অন্যদিকে, envবাহ্যিক আদেশ হওয়ায় আপনি এটি করতে পারবেন না:

f() { ...; }
env A=B f

বা:

env A=B eval '...'

এছাড়াও:

A=B cmd

বৈধ শেল ভেরিয়েবলের নামগুলি কেবল এনভ ভার্সের সাথে কাজ করে । আপনার envঅন্য কোনও এনভির বর্ণের প্রয়োজন :

env 'my var=foo' cmd...

bash_পরিবর্তনশীল পুনরায় সেট করুন :

bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx

ইন zsh, ARGV0এবং STTYযে প্রেক্ষাপটে বিশেষ অর্থ আছে:

STTY=-echo cat

রান catটার্মিনাল সঙ্গে echoঅক্ষম। এবং:

ARGV0=foo cmd

এটির cmdসাথে চালায় ।fooargv[0]

আপনি যদি এই বিশেষ প্রক্রিয়াকরণটি না চান তবে আপনাকে ব্যবহার করতে হবে env

নোট যা sudoসমর্থন করে:

sudo A=B cmd

এটি শেলটি বা এটি envকরার জন্য ব্যবহার করছে না। এটি নিজে থেকে এটি করে।

এটি যে নামের সাথে শুরু হয় তা বাদ দিয়ে যেকোনো নামের সাথে ভেরিয়েবলগুলি পাস করতে পারে -

অ্যাসাইনমেন্টটি একটি শেল কনস্ট্রাক্ট যেখানে যুক্তির সমান চিহ্নটি শেলের envকোনও বিশেষ অর্থ রাখে না তাই A=$B cmdনিরাপদ যেখানে env A="$B" cmd(বা sudo A="$B" cmd) ডাবল উদ্ধৃতি প্রয়োজন।

A=B cmdসিনট্যাক্সটি কেবল বোর্ন এবং rcপরিবারের শেলগুলিতে সমর্থিত ( esযদিও নেই)। উদাহরণস্বরূপ cshবা fishপরিবারগুলির শেলগুলিতে আপনাকে অবলম্বন করতে হবে env

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