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


237

অনুগ্রহপূর্বক আমাকে কি কেউ সাহায্য করতে পারবেন? পার্লে, এর মধ্যে পার্থক্য কী:

exec "command";

এবং

system("command");

এবং

print `command`;

শেল কমান্ড চালানোর অন্যান্য উপায় আছে কি?


8
এই স্ট্যাকওভারফ্লো . com / জিজ্ঞাসাগুলি / 12৯7১১২7/২ এর প্রায় হুবহু ডুপ্লিকেট , এটি বাদে অন্যটির পাইপ রয়েছে।
মাইকেল ম্যাইইয়ার্স

উত্তর:


268

Exec

একটি আদেশ কার্যকর করে এবং কখনই ফিরে আসে না । এটি returnএকটি ফাংশনে একটি বিবৃতি মত ।

কমান্ডটি পাওয়া না গেলে execমিথ্যা ফিরতি দেয়। এটি কখনই সত্য হয় না, কারণ আদেশটি পাওয়া গেলে এটি কখনই ফিরে আসে না returns এছাড়া ফেরার কোন বিন্দু আছে STDOUT, STDERRবা কমান্ডের প্রস্থান অবস্থা। আপনি এটি সম্পর্কে ডকুমেন্টেশন খুঁজে পেতে পারেন perlfunc, কারণ এটি একটি ফাংশন।

পদ্ধতি

একটি কমান্ড কার্যকর করে এবং আপনার পার্ল স্ক্রিপ্ট কমান্ডটি শেষ হওয়ার পরে চালিয়ে যায়।

রিটার্ন মান হ'ল কমান্ডের প্রস্থান স্থিতি। আপনি এটি সম্পর্কে ডকুমেন্টেশন খুঁজে পেতে পারেন perlfunc

ব্যাকটিক

যেমন systemএকটি কমান্ড কার্যকর করে এবং আপনার পার্ল স্ক্রিপ্ট কমান্ডটি শেষ হওয়ার পরে চালিয়ে যায়।

বিপরীতে systemরিটার্ন মান STDOUTকমান্ডের হয়। qx//ব্যাকটিক্স সমতুল্য। আপনি এটি সম্পর্কে ডকুমেন্টেশন সন্ধান করতে পারেন perlop, কারণ বিপরীত systemএবং execএটি অপারেটর।


অন্যান্য উপায়

উপরের থেকে যা অনুপস্থিত তা হ'ল সংজ্ঞাটি অ্যাসিঙ্ক্রোনালিভাবে চালিত করার উপায়। তার অর্থ আপনার পার্ল স্ক্রিপ্ট এবং আপনার আদেশ একই সাথে চলমান। এটি দিয়ে সম্পন্ন করা যেতে পারে open। এটি আপনাকে আপনার আদেশটি পড়তে STDOUT/ STDERRএবং লেখার অনুমতি দেয় STDIN। এটি যদিও প্ল্যাটফর্ম নির্ভর।

বেশ কয়েকটি মডিউল রয়েছে যা এই কাজগুলিকে স্বাচ্ছন্দ্য করতে পারে। সেখানে রয়েছে IPC::Open2এবং IPC::Open3এবং IPC::Runপাশাপাশি Win32::Process::Createআপনি যদি উইন্ডোতে থাকেন।


1
আমি মনে করি আপনার অর্থ s / perlcunc / perlfunc / ... এছাড়াও পেরিলিপসি ডকুমেন্টেশন পাইপগুলি খোলার বিষয়ে গভীর গভীরতায় যায়।
মুহুর্তের

7
পার্লকঙ্ক, সম্ভবত এটি আমার নতুন ডাক নাম হবে ;-)
লুডউইগ ওয়েইঞ্জিয়েরেল

8
রেকর্ডের জন্য, ব্যাকটিকস এবং কিউএক্স [] এছাড়াও pop জনপুষ্ট করে? (ওএস রিটার্ন মান)।
jjohn

167

সাধারণ আমি ব্যবহারের ইন system, open, IPC::Open2, অথবা IPC::Open3আমি কি করতে চান তার উপর নির্ভর করে। qx//অপারেটর, যখন সহজ, খুব তার কার্যকারিতা constraining হয় দ্রুত হ্যাক খুব দরকারী বাহিরে যাবে। আমি openঅনেক হ্যান্ডিয়ার খুঁজে পাই ।

system: একটি কমান্ড চালান এবং এটি ফিরে আসার জন্য অপেক্ষা করুন

systemআপনি যখন কোনও কমান্ড চালাতে চান তখন ব্যবহার করুন , এর আউটপুট সম্পর্কে চিন্তা করবেন না এবং কমান্ড শেষ না হওয়া পর্যন্ত পার্ল স্ক্রিপ্ট কিছু করতে চান না।

#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");

অথবা

#spawns a shell, arguments are interpreted by the shell, use only if you
#want the shell to do globbing (e.g. *.txt) for you or you want to redirect
#output
system("command arg1 arg2 arg3");

qx//বা `` : একটি কমান্ড চালান এবং এটির STDOUT ক্যাপচার করুন

qx//আপনি যখন কোনও কমান্ড চালাতে চান তখন ব্যবহার করুন , এটি STDOUT এ যা লিখেছে তা ক্যাপচার করুন এবং কমান্ড শেষ না হওয়া পর্যন্ত পার্ল স্ক্রিপ্ট কিছু করতে চান না।

#arguments are always processed by the shell

#in list context it returns the output as a list of lines
my @lines = qx/command arg1 arg2 arg3/;

#in scalar context it returns the output as one string
my $output = qx/command arg1 arg2 arg3/;

exec: বর্তমান প্রক্রিয়াটিকে অন্য প্রক্রিয়াতে প্রতিস্থাপন করুন।

আপনি যখন কোনও কমান্ড চালাতে চান execতার সাথে ব্যবহার করুন fork, এর আউটপুট সম্পর্কে চিন্তা করবেন না এবং এটি ফিরে আসার অপেক্ষা রাখবেন না। systemসত্যিই ঠিক

sub my_system {
    die "could not fork\n" unless defined(my $pid = fork);
    return waitpid $pid, 0 if $pid; #parent waits for child
    exec @_; #replace child with new process
}

এছাড়াও আপনি পড়তে পারেন waitpidএবং perlipcম্যানুয়াল।

open: একটি প্রক্রিয়া চালান এবং তার STDIN বা STDERR এ একটি পাইপ তৈরি করুন

ব্যবহারের openআপনি যদি একটি প্রক্রিয়া এর stdin ডেটা লিখতে বা একটি প্রক্রিয়া এর stdout- এ থেকে ডেটা পড়তে (কিন্তু একই সময়ে উভয় নয়) চান।

#read from a gzip file as if it were a normal file
open my $read_fh, "-|", "gzip", "-d", $filename
    or die "could not open $filename: $!";

#write to a gzip compressed file as if were a normal file
open my $write_fh, "|-", "gzip", $filename
    or die "could not open $filename: $!";

আইপিসি :: ওপেন 2 : একটি প্রক্রিয়া চালান এবং STDIN এবং STDOUT উভয়ের জন্য একটি পাইপ তৈরি করুন

IPC::Open2যখন আপনার কোনও প্রক্রিয়াটির STDIN এবং STDOUT থেকে পড়তে হবে এবং লিখতে হবে তখন ব্যবহার করুন ।

use IPC::Open2;

open2 my $out, my $in, "/usr/bin/bc"
    or die "could not run bc";

print $in "5+6\n";

my $answer = <$out>;

আইপিসি :: ওপেন 3 : একটি প্রক্রিয়া চালান এবং STDIN, STDOUT, এবং STDERR তে একটি পাইপ তৈরি করুন

IPC::Open3আপনি যখন প্রক্রিয়াটির তিনটি স্ট্যান্ডার্ড ফাইল হ্যান্ডেলগুলি ক্যাপচার করতে চান তখন ব্যবহার করুন । আমি একটি উদাহরণ লিখব, তবে এটি বেশিরভাগভাবে আইপিসি :: ওপেন 2-তে একইভাবে কাজ করে তবে আর্গুমেন্ট এবং তৃতীয় ফাইল হ্যান্ডেলের সাথে কিছুটা আলাদা অর্ডার দিয়ে।


খুব তথ্যপূর্ণ এবং আপ টু ডেট উত্তর। ধন্যবাদ @ Chas-Owens
জস্সী

আইপিসি :: ওপেন 3 বেশিরভাগ ব্যবহারের জন্য খুব নিম্ন-স্তরের। আইপিসি :: রান 3 এবং আইপিসি :: রান সাধারণত অনেক বেশি উপযুক্ত।
ইকেগামি

17

আমি প্রথমে ম্যানুয়ালগুলি উদ্ধৃত করি:

পার্লডোক এক্সিকিউট () :

এক্সিকিউটিভ ফাংশন একটি সিস্টেম কমান্ড কার্যকর করে এবং কখনই ফিরে আসে না - আপনি যদি ফিরে চান তবে এক্সেকের পরিবর্তে সিস্টেম ব্যবহার করুন

পার্লডোক সিস্টেম () :

প্রথমে একটি কাঁটাচামচ সম্পন্ন করা ব্যতীত এক্সিকিউটিভ লিস্টের মতো একই জিনিসটি করে এবং পিতামাতার প্রক্রিয়াটি শিশু প্রক্রিয়াটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।

এক্সিকিউটিভ এবং সিস্টেমের বিপরীতে , ব্যাকটিকগুলি আপনাকে ফেরত মান দেয় না তবে সংগ্রহ করা STDOUT।

পার্লডোক `স্ট্রিং` :

একটি স্ট্রিং যা (সম্ভবত) ইন্টারপোল্টেড হয় এবং তারপরে / বিন / শ বা এর সমতুল্য সিস্টেম কমান্ড হিসাবে কার্যকর করা হয় । শেল ওয়াইল্ডকার্ড, পাইপ এবং পুনঃনির্দেশগুলি সম্মানিত হবে। কমান্ডের সংগৃহীত স্ট্যান্ডার্ড আউটপুট ফিরে আসে ; মান ত্রুটি প্রভাবিত হয় না।


বিকল্প:

আরও জটিল পরিস্থিতিতে, যেখানে আপনি STDOUT, STDERR বা রিটার্ন কোড আনতে চান, আপনি আইপিসি :: ওপেন 2 এবং আইপিসি :: ওপেন 3 এর মতো সুপরিচিত মানক মডিউলগুলি ব্যবহার করতে পারেন ।

উদাহরণ:

use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;

শেষ অবধি , আইপিসি :: সিপিএএন থেকে চালানোও দেখার মতো ...


3
এটি একটি অভদ্র প্রতিক্রিয়া। রাগ না করে আপনার সাহায্য করার চেষ্টা করা উচিত।
শেন সি ম্যাসন

1
আমি মনে করি তিনি কেবল 'আরটিএফএম: পি
ভি 3-

অসভ্যতা বলতে আসলে বোঝানো হয়নি;) কোনও ভুল বোঝাবুঝি এড়াতে এফ-শব্দটি সরানো হয়েছে…
বেনিডিক্ট ওয়াল্ডভোগেল

2
আমি অবশ্যই এটি অভদ্র বলে ব্যাখ্যা করি নি। ব্রুসেক, সম্ভবত, তবে এটি একটি উচ্চ-বুদ্ধিমান প্রশ্ন নয় যা একটি বিবেচনামূলক উত্তর প্রয়োজন।
মুহুর্তের

11

পার্লের ব্যাকটিক্স ( `) system, এবং এর মধ্যে পার্থক্য কী exec?

exec -> exec "command"; ,
system -> system("command"); and 
backticks -> print `command`;

exec

execএকটি কমান্ড কার্যকর করে এবং পার্ল স্ক্রিপ্টটি আর কখনও শুরু করে না। এটি কোনও স্ক্রিপ্টের মতো একটি returnবিবৃতি যেমন কোনও ফাংশন to

কমান্ডটি পাওয়া না গেলে, execমিথ্যা প্রত্যাবর্তন করে। এটি কখনই সত্য হয় না, কারণ যদি কমান্ডটি পাওয়া যায় তবে এটি কখনই ফিরে আসে না। এছাড়া ফেরার কোন বিন্দু আছে STDOUT, STDERRবা কমান্ডের প্রস্থান অবস্থা। পারফ্ল্যাঙ্কে আপনি এটি সম্পর্কে নথিপত্র পেতে পারেন , কারণ এটি একটি ফাংশন।

উদাহরণ:

#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";

উপরের কোডে, তিনটি printবিবৃতি আছে, তবে execস্ক্রিপ্টটি রেখে যাওয়ার কারণে কেবলমাত্র প্রথম মুদ্রণ বিবৃতি কার্যকর করা হয়। এছাড়াও, execকমান্ড আউটপুট কোনও ভেরিয়েবলের জন্য বরাদ্দ করা হচ্ছে না।

এখানে, আপনি কেবলমাত্র প্রথম printবিবৃতিটির আউটপুট পাচ্ছেন এবং lsস্ট্যান্ডার্ড আউট- এ কমান্ডটি কার্যকর করছেন।

system

systemএকটি কমান্ড কার্যকর করে এবং কমান্ড শেষ হওয়ার পরে আপনার পার্ল স্ক্রিপ্ট পুনরায় শুরু হয়। রিটার্ন মান হ'ল কমান্ডের প্রস্থান স্থিতি। পারফ্ল্যাঙ্কে আপনি এটি সম্পর্কে নথিপত্র পেতে পারেন ।

উদাহরণ:

#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";

উপরের কোডে, তিনটি printবিবৃতি আছে। systemকমান্ডের পরে স্ক্রিপ্টটি পুনরায় শুরু হওয়ার সাথে সাথে তিনটি মুদ্রণ বিবৃতি কার্যকর করা হয়।

এছাড়াও, চলমান ফলাফল system হয় নির্ধারিত data2, কিন্তু নির্ধারিত মান 0(থেকে প্রস্থান কোড ls)।

এখানে, আপনি প্রথম printস্টেটমেন্টের আউটপুট পাচ্ছেন , তারপরে lsকমান্ডের, printস্ট্যান্ডার্ড আউট সম্পর্কে চূড়ান্ত দুটি বিবৃতি আউটপুটগুলি অনুসরণ করবে।

ব্যাকটিক্স ( `)

যেমন system, ব্যাকটিক্সে একটি কমান্ড আবদ্ধ করা সেই আদেশটি কার্যকর করে এবং আদেশটি শেষ হয়ে যাওয়ার পরে আপনার পার্ল স্ক্রিপ্টটি আবার শুরু করা হয়। বিপরীতে system, রিটার্ন মান STDOUTকমান্ডের হয়। qx//ব্যাকটিক্স সমতুল্য। আপনি এটি সম্পর্কে ডকুমেন্টেশন জানতে পারেন perlop , কারণ সিস্টেমের বিপরীতে এবং execএটি অপারেটর।

উদাহরণ:

#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";

উপরের কোডে, তিনটি printবিবৃতি আছে এবং তিনটিই কার্যকর করা হচ্ছে। এর আউটপুটটি lsসরাসরি স্ট্যান্ডার্ড হয়ে যায় না, তবে ভেরিয়েবলকে বরাদ্দ করা হয় data2এবং তারপরে চূড়ান্ত মুদ্রণ বিবৃতি দ্বারা মুদ্রিত হয়।


উদাহরণ সহ সেরা ব্যাখ্যা। অনেক ধন্যবাদ.
আরসলান আনোয়ার

2

'এক্সিকিউটিভ' এবং 'সিস্টেমের' মধ্যে পার্থক্য হ'ল এক্সিকিউটর আপনার বর্তমান প্রোগ্রামকে 'কমান্ড' দিয়ে প্রতিস্থাপন করে এবং আপনার প্রোগ্রামে কখনও ফিরে আসে না। অন্যদিকে সিস্টেম কাঁটাচামচ করে 'কমান্ড' চালায় এবং 'কমান্ড' এর প্রস্থান স্থিতিটি চালু হয়ে গেলে ফিরে আসে। পিছনের টিকটি 'কমান্ড' চালায় এবং তারপরে স্ট্রিংটি স্ট্যান্ডার্ড করে উপস্থাপন করে (যা স্ক্রিনে প্রিন্ট করে থাকত)

শেল কমান্ডগুলি চালাতে আপনি পপেনও ব্যবহার করতে পারেন এবং আমি মনে করি একটি শেল মডিউল রয়েছে - 'শেল ব্যবহার করুন' যা আপনাকে সাধারণ শেল কমান্ডগুলির স্বচ্ছ অ্যাক্সেস দেয়।

আশা করি এটি আপনার জন্য এটি স্পষ্ট করে দেয়।


সম্ভবত আপনি বোঝাতে চেয়েছেন use Shell;( search.cpan.org/dist/Shell/Shell.pm )? এটি ব্যাপকভাবে ইনস্টল করা হয়নি, বা এটি প্রশ্নটির জন্যও প্রযোজ্য নয় বলে আমি মনে করি ...
প্রশংসাপত্র

1
তাঁর প্রশ্নের শেষ অংশটি ছিল "শেল কমান্ডগুলি চালানোর অন্যান্য উপায়গুলি কি" - শেল কমান্ড চালানোর অন্য উপায় শেল।
শেন সি ম্যাসন

2
দস্তাবেজগুলিতে সুনির্দিষ্টভাবে বলা আছে "কয়েকটি পার্ল বৈশিষ্ট্য চিত্রিত করে এই প্যাকেজটি শো কেস হিসাবে অন্তর্ভুক্ত করা হয়েছে It এটি উত্পাদন প্রোগ্রামের জন্য ব্যবহার করা উচিত নয় Although যদিও এটি স্বেচ্ছাসেবী আদেশগুলির মানক আউটপুট পাওয়ার জন্য একটি সাধারণ ইন্টারফেস সরবরাহ করে, আরও ভাল হতে পারে আপনার যা প্রয়োজন তা অর্জনের উপায় "।
চস 22

2
আবার এটি তার অন্যান্য প্রশ্নেরও উত্তর দিয়েছে
শান সি। ম্যাসন

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