ইভাল এবং এক্সিকিউট মধ্যে পার্থক্য কি?


81

evalএবং execউভয়ই বাশ (1) এর আদেশগুলিতে অন্তর্নির্মিত যা আদেশগুলি কার্যকর করে।

আমি আরও execকয়েকটি বিকল্প আছে দেখতে পাচ্ছি কিন্তু এটিই কেবল পার্থক্য? তাদের প্রসঙ্গে কি ঘটে?



উত্তর:


124

evalএবং execসম্পূর্ণ ভিন্ন জন্তু। (উভয়ই কমান্ড চালাবে এই কথাটি বাদে, তবে শেলটিতে আপনি যা কিছু করেন তা তাই করে))

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

যা exec cmdহয় তা ঠিক চালানোর মতোই cmd, বর্তমান শেলটি পৃথক প্রক্রিয়া চালনার পরিবর্তে কমান্ড দ্বারা প্রতিস্থাপন করা হয়। অভ্যন্তরীণভাবে, চলমান বলুন একটি শিশু প্রক্রিয়া তৈরি করার জন্য /bin/lsকল করবে fork()এবং তারপরে exec()বাচ্চাকে মৃত্যুদন্ড কার্যকর করতে হবে /bin/lsexec /bin/lsঅন্যদিকে কাঁটাচামচ হবে না , তবে কেবল শেলটি প্রতিস্থাপন করবে।

তুলনা করা:

$ bash -c 'echo $$ ; ls -l /proc/self ; echo foo'
7218
lrwxrwxrwx 1 root root 0 Jun 30 16:49 /proc/self -> 7219
foo

সঙ্গে

$ bash -c 'echo $$ ; exec ls -l /proc/self ; echo foo'
7217
lrwxrwxrwx 1 root root 0 Jun 30 16:49 /proc/self -> 7217

echo $$আমি যে শেলটি শুরু করেছি তার পিআইডি মুদ্রণ করে এবং তালিকাটি শেল থেকে যে /proc/selfপিআইডি lsচালিত হয়েছিল তা দেয়। সাধারণত, প্রক্রিয়া আইডি আলাদা হয় execতবে শেলের সাথে এবং lsএকই প্রক্রিয়া আইডি থাকে। এছাড়াও, execশেলটি প্রতিস্থাপন করা হওয়ার পরে নিম্নলিখিত কমান্ডটি চালিত হয়নি।


অন্য দিকে:

$ help eval
eval: eval [arg ...]
    Execute arguments as a shell command.

evalবর্তমান শেলটিতে একটি কমান্ড হিসাবে আর্গুমেন্টগুলি চালিত করবে। অন্য কথায় eval foo barন্যায় হিসাবে একই foo bar। কার্যকর করার আগে ভেরিয়েবলগুলি প্রসারিত হবে, সুতরাং আমরা শেল ভেরিয়েবলগুলিতে সংরক্ষিত কমান্ডগুলি কার্যকর করতে পারি:

$ unset bar
$ cmd="bar=foo"
$ eval "$cmd"
$ echo "$bar"
foo

এটি একটি শিশু প্রক্রিয়া তৈরি করবে না , সুতরাং চলকটি বর্তমান শেলটিতে সেট করা আছে। (অবশ্যই eval /bin/lsকোনও শিশু প্রক্রিয়া তৈরি করবে, ঠিক একইভাবে একটি সরল বৃদ্ধা তৈরি /bin/lsকরবে))

অথবা আমাদের কাছে একটি কমান্ড থাকতে পারে যা শেল কমান্ড আউটপুট করে। দৌড়ানো ssh-agentব্যাকগ্রাউন্ডে এজেন্ট শুরু করে, এবং প্রচুর পরিমাণে পরিবর্তনশীল অ্যাসাইনমেন্ট আউটপুট দেয়, যা বর্তমান শেলটিতে সেট করা যেতে পারে এবং শিশু প্রক্রিয়াগুলি ব্যবহার করে (আপনি যে sshআদেশগুলি চালাতেন)। তাই ssh-agentদিয়ে শুরু করা যেতে পারে:

eval $(ssh-agent)

এবং বর্তমান শেলটি অন্যান্য কমান্ডের উত্তরাধিকারের জন্য ভেরিয়েবলগুলি পাবে।


অবশ্যই, যদি ভেরিয়েবলের cmdমতো এমন কিছু ঘটে থাকে rm -rf $HOMEতবে দৌড়ানো eval "$cmd"আপনি যা করতে চান তা হ'ল না। এমনকি স্ট্রিংয়ের ভিতরে কমান্ড বিকল্পের মতো জিনিসগুলিও প্রক্রিয়াজাত করা হবে, তাই সত্যই নিশ্চিত হওয়া উচিত যে ইনপুটটি ব্যবহারের আগে এটি নিরাপদ।eval

প্রায়শই evalদুর্ঘটনাক্রমে ভুল উপায়ে কোড এবং ডেটা মিশ্রণ করা এবং এড়ানো সম্ভব ।


এটি একটি দুর্দান্ত উত্তর, @ ইল্কাচ্ছু। ধন্যবাদ!
উইলিয়ান পাইকাসাও

: Eval ব্যবহার সম্পর্কে আরো বিস্তারিত এখানে পাওয়া যাবে stackoverflow.com/a/46944004/2079103
clearlight

1
@ ক্লেয়ারলাইট, ভাল, এটি আমাকে এই উত্তরটিতেও প্রথম স্থানে ব্যবহার না করারeval বিষয়ে সাধারণ অস্বীকৃতি যুক্ত করতে স্মরণ করিয়ে দেয় । পরোক্ষভাবে পরিবর্তনগুলি পরিবর্তন করার মতো স্টাফ অনেকগুলি শেলের মধ্যে declare/ typeset/ namerefএবং বিস্তারের মাধ্যমে করা যেতে পারে ${!var}, সুতরাং evalযদি আমি সত্যিই এটি এড়াতে না পারি তবে আমি এর পরিবর্তে সেগুলি ব্যবহার করব।
ilkkachu

27

execএকটি নতুন প্রক্রিয়া তৈরি করে না। এটি বর্তমান কমান্ডটি নতুন কমান্ডের সাথে প্রতিস্থাপন করে। আপনি যদি কমান্ড লাইনে এটি করেন তবে কার্যকরভাবে এটি আপনার শেল সেশনটি শেষ করবে (এবং সম্ভবত আপনাকে লগ আউট করবে বা টার্মিনাল উইন্ডোটি বন্ধ করে দেবে!)

যেমন

ksh% bash
bash-4.2$ exec /bin/echo hello
hello
ksh% 

এখানে আমি আছি ksh(আমার সাধারণ শেল)। আমি শুরু করি bashএবং তারপরে বাশের ভিতরে exec /bin/echo। আমরা দেখতে পাচ্ছি যে আমাকে kshপরে পিছনে ফেলে দেওয়া হয়েছে কারণ bashপ্রক্রিয়াটি প্রতিস্থাপন করা হয়েছিল /bin/echo


উম্মু মুখের পিছনে কেশ বি / সি প্রক্রিয়াতে ফিরে এসে ইকো দ্বারা প্রতিস্থাপিত হয়েছিল তা কি এতটা বোঝায় না?

14

টি এল; ডিআর

execকোনও কমান্ড সুনির্দিষ্ট না করা থাকলে বর্তমান শেল প্রক্রিয়াটিকে নতুন এবং হ্যান্ডেল স্ট্রিম রিডাইরেকশন / ফাইল বর্ণনাকারীদের সাথে প্রতিস্থাপন করতে ব্যবহৃত হয়। evalকমান্ড হিসাবে স্ট্রিং মূল্যায়ন করতে ব্যবহৃত হয়। উভয়ই রান-টাইমে পরিচিত আর্গুমেন্টগুলির সাথে একটি কমান্ড তৈরি এবং execসম্পাদন করতে ব্যবহৃত হতে পারে তবে কমান্ডগুলি কার্যকর করার সাথে সাথে বর্তমান শেলের প্রক্রিয়াটি প্রতিস্থাপন করে।

এক্সিকিউটিভ বিল ইন

বাক্য গঠন:

exec [-cl] [-a name] [command [arguments]]

ম্যানুয়াল অনুসারে যদি কমান্ডটি অন্তর্নির্মিত নির্দিষ্ট করে থাকে

... শেল প্রতিস্থাপন। কোনও নতুন প্রক্রিয়া তৈরি হয় না। আর্গুমেন্ট কমান্ড আর্গুমেন্ট হয়ে।

অন্য কথায়, আপনি যদি bashপিআইডি 1234 দিয়ে চালাচ্ছিলেন এবং যদি আপনি exec top -u rootসেই শেলের মধ্যে দৌড়াতে চান তবে topকমান্ডটির পিআইডি 1234 থাকবে এবং আপনার শেল প্রক্রিয়াটি প্রতিস্থাপন করবে।

কোথায় এটি দরকারী? মোড়ক স্ক্রিপ্ট হিসাবে পরিচিত কিছু। এই ধরনের স্ক্রিপ্টগুলি আর্গুমেন্টগুলির সেট তৈরি করে বা পরিবেশে কী পরিবর্তনশীল তা নিয়ে নির্দিষ্ট সিদ্ধান্ত নেয় এবং তারপরে execযা কিছু আদেশ নির্দিষ্ট হয় তা দিয়ে নিজেকে প্রতিস্থাপন করতে ব্যবহার করে এবং অবশ্যই সেই একই যুক্তি সরবরাহ করে যা মোড়ক স্ক্রিপ্টটি সেই পথে তৈরি করেছে।

ম্যানুয়ালটিতে কী বলেছে তা হ'ল:

যদি কমান্ড নির্দিষ্ট না করা থাকে তবে বর্তমান শেলটিতে যে কোনও পুনর্নির্দেশ কার্যকর হবে

এটি আমাদের বর্তমান শেল আউটপুট স্ট্রিমগুলি থেকে কোনও ফাইলে পুনঃনির্দেশ করতে দেয়। এটি লগিং বা ফিল্টারিংয়ের উদ্দেশ্যে কার্যকর হতে পারে, যেখানে আপনি stdoutকেবল আদেশগুলি দেখতে চান না stderr। উদাহরণস্বরূপ, যেমন:

bash-4.3$ exec 3>&1
bash-4.3$ exec > test_redirect.txt
bash-4.3$ date
bash-4.3$ echo "HELLO WORLD"
bash-4.3$ exec >&3
bash-4.3$ cat test_redirect.txt 
2017 05 20 星期六 05:01:51 MDT
HELLO WORLD

এই আচরণটি শেল স্ক্রিপ্টগুলিতে লগ ইন করতে , ফাইল বা প্রক্রিয়াগুলিকে পৃথক করে স্ট্রিমগুলিকে পুনঃনির্দেশকরণ এবং ফাইল বর্ণনাকারী সহ অন্যান্য মজাদার স্টাফকে সহজ করে তোলে ।

কমপক্ষে bash4.3 সংস্করণের জন্য সোর্স কোড স্তরে execঅন্তর্নির্মিতটি সংজ্ঞায়িত করা হয়েছে builtins/exec.def। এটি প্রাপ্ত কমান্ডগুলি পার্স করে, এবং যদি কোনও থাকে তবে এটি ফাইলগুলিতে shell_execve()সংজ্ঞায়িত জিনিসগুলিকে পাস করে execute_cmd.c

দীর্ঘ গল্প সংক্ষেপে, execসি প্রোগ্রামিং ভাষায় কমান্ডের একটি পরিবার উপস্থিত রয়েছে এবং shell_execve()এটি মূলত execve:

/* Call execve (), handling interpreting shell scripts, and handling
   exec failures. */
int
shell_execve (command, args, env)
     char *command;
     char **args, **env;
{

eval অন্তর্নির্মিত

ব্যাশ ৪.৩ ম্যানুয়াল স্টেটস (আমার দ্বারা জোর দেওয়া):

আরোগ্যগুলি একক কমান্ডের সাথে একত্রে পড়া এবং সংমিশ্রণ করা হয়। এর পরে এই কমান্ডটি শেল দ্বারা পড়া এবং সম্পাদন করা হয় এবং এর প্রস্থান স্থিতিটি eval এর মান হিসাবে ফিরে আসে is

মনে রাখবেন যে কোনও প্রক্রিয়া প্রতিস্থাপন ঘটছে না। execলক্ষ্যটি execve()কার্যকারিতা অনুকরণ করা যেখানে তার বিপরীতে , evalঅন্তর্নির্মিতটি কেবল "মূল্যায়ন" যুক্তি সরবরাহ করে, ঠিক যেমন ব্যবহারকারী তাদের কমান্ড লাইনে টাইপ করেছেন। যেমন, নতুন প্রক্রিয়া তৈরি করা হয়।

কোথায় এটি দরকারী হতে পারে? গিলস যেমন এই উত্তরে উল্লেখ করেছেন যে , "... ইভাল খুব বেশি ব্যবহৃত হয় না। কিছু শেলের মধ্যে সর্বাধিক সাধারণ ব্যবহার এমন একটি চলকের মান অর্জন করা হয় যার নাম রানটাইম অবধি জানা যায় না"। ব্যক্তিগতভাবে, আমি এটি উবুন্টুতে বেশ কয়েকটি স্ক্রিপ্টে ব্যবহার করেছি যেখানে ব্যবহারকারী বর্তমানে নির্দিষ্ট ওয়ার্কস্পেসের উপর ভিত্তি করে একটি কমান্ড কার্যকর / মূল্যায়ন করা প্রয়োজন।

উত্স কোড স্তরে এটি সংজ্ঞায়িত করা হয় builtins/eval.defএবং পার্সড ইনপুট স্ট্রিংটি evalstring()কার্য করতে দেয়।

অন্যান্য বিষয়ের মধ্যে, evalকরতে ভেরিয়েবল নির্ধারণ যা বর্তমান শেল সঞ্চালনের পরিবেশে থাকা, যখন execনা যা করতে পারেন:

$ eval x=42
$ echo $x
42
$ exec x=42
bash: exec: x=42: not found

@ ctrl-alt-delor আমি সেই অংশটি সম্পাদনা করেছি, ধন্যবাদ, যদিও এটি যুক্তিযুক্তভাবে একটি নতুন প্রক্রিয়া তৈরি করেছে, পিআইডি কেবল বর্তমান শেলের মতোই রয়েছে remains ভবিষ্যতে কোনও মন্তব্য এবং ডাউনওয়োট না দিয়ে উত্তরগুলি সম্পাদনা করার বিষয়ে বিবেচনা করুন, বিশেষত যেখানে word-শব্দের বাক্যাংশের মতো ছোটখাটো জিনিস প্রশ্নে রয়েছে; কোনও উত্তর সম্পাদনা করতে এবং সংশোধন করতে এটি অনেক কম সময়সাপেক্ষ এবং এটি আরও বেশি সহায়ক।
সের্গেই কোলোডিয়াজনি

5
একটি নতুন শিশু প্রক্রিয়া তৈরি করা, যুক্তি চালানো এবং প্রস্থান স্থিতি ফিরিয়ে দেওয়া।

আহ কি? পুরো বিষয়টি evalহ'ল এটি কোনওভাবেই শিশু প্রক্রিয়া তৈরি করে না। যদি আমি করি

eval "cd /tmp"

একটি শেলের মধ্যে, তারপরে বর্তমান শেল ডিরেক্টরি পরিবর্তন হবে। উভয়ই execএকটি নতুন শিশু প্রক্রিয়া তৈরি করে না , পরিবর্তে এটি প্রদত্ত সন্তানের জন্য বর্তমান এক্সিকিউটেবল (যথা শেল) পরিবর্তন করে; প্রক্রিয়া আইডি (এবং ফাইল এবং অন্যান্য সামগ্রী খুলুন) একই থাকে stay এর বিপরীতে eval, এক্সিকিউটেবলকে খুঁজে পেতে বা লোড করতে না পেরে বা যুক্তি সম্প্রসারণের সমস্যার কারণে মারা না যাওয়ার কারণে নিজেই ব্যর্থ execনা হলে কলিং শেলটিতে ফিরে আসবে না exec

evalমূলত এর যুক্তি (গুলি) কে সংক্ষিপ্তকরণের পরে স্ট্রিং হিসাবে ব্যাখ্যা করে, যথা এটি ওয়াইল্ডকার্ড সম্প্রসারণ এবং যুক্তি বিভাজনের অতিরিক্ত স্তর করবে। execএরকম কিছু করে না


1
আসল প্রশ্নটি "ইয়াল এবং এক্সিকিউট উভয়ই বাশ (1) এর অন্তর্নির্মিত কমান্ড এবং কমান্ডগুলি কার্যকর করে একটি নতুন শিশু প্রক্রিয়া তৈরি করে, যুক্তিগুলি চালায় এবং প্রস্থান স্থিতি ফিরে আসে"; আমি মিথ্যা অনুমানটি সম্পাদনা করেছি।
চার্লস স্টুয়ার্ট 15

-1

মূল্যায়ন

এই কাজ:

$ echo hi
hi

$ eval "echo hi"
hi

$ exec echo hi
hi

তবে, এটি না:

$ exec "echo hi"
bash: exec: echo hi: not found

$ "echo hi"
bash: echo hi: command not found

প্রক্রিয়া চিত্র প্রতিস্থাপন

এই উদাহরণটি প্রদর্শন করে যে execএটির কলিং প্রক্রিয়াটির চিত্রটি কীভাবে প্রতিস্থাপন করে:

# Get PID of current shell
sh$ echo $$
1234

# Enter a subshell with PID 5678
sh$ sh

# Check PID of subshell
sh-subshell$ echo $$
5678

# Run exec
sh-subshell$ exec echo $$
5678

# We are back in our original shell!
sh$ echo $$
1234

লক্ষ করুন যে, exec echo $$subshell এর PID, সঙ্গে দৌড়ে! তদ্ব্যতীত, এটি সম্পূর্ণ হওয়ার পরে, আমরা আমাদের মূল sh$শেল ফিরে এসেছি ।

অন্যদিকে, প্রক্রিয়া চিত্র প্রতিস্থাপন evalকরে না । বরং এটি প্রদত্ত কমান্ডটি চালায় যেমন আপনি সাধারণত শেলের মধ্যেই থাকেন। (অবশ্যই, যদি আপনি একটি কমান্ড চালনা করেন যার জন্য একটি প্রক্রিয়া তৈরি করা প্রয়োজন ... এটি ঠিক তাই করে!)

sh$ echo $$
1234

sh$ sh

sh-subshell$ echo $$
5678

sh-subshell$ eval echo $$
5678

# We are still in the subshell!
sh-subshell$ echo $$
5678

আমি এই উত্তরটি পোস্ট করেছি কারণ অন্যান্য উদাহরণগুলি সত্যই আই এর মতো দুর্বল মনের পক্ষে যথেষ্ট বোধগম্য উপায়ে এটি চিত্রিত করে নি
মাতীন উলহাক

শব্দের দুর্বল পছন্দ: প্রক্রিয়া প্রতিস্থাপন একটি বিদ্যমান ধারণা যা এখানে আপনি চিত্রিত করছেন তার সাথে সম্পর্কিত নয় বলে মনে হচ্ছে।
মুরু

@ মুরু কি "প্রক্রিয়া প্রতিস্থাপন" আরও ভাল? সঠিক পরিভাষা কী তা আমি নিশ্চিত নই। ম্যানপেজটি এটিকে "প্রক্রিয়া চিত্রটি প্রতিস্থাপন করে" বলে মনে হচ্ছে।
মতিন উলহাক

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