অনুগ্রহপূর্বক আমাকে কি কেউ সাহায্য করতে পারবেন? পার্লে, এর মধ্যে পার্থক্য কী:
exec "command";
এবং
system("command");
এবং
print `command`;
শেল কমান্ড চালানোর অন্যান্য উপায় আছে কি?
অনুগ্রহপূর্বক আমাকে কি কেউ সাহায্য করতে পারবেন? পার্লে, এর মধ্যে পার্থক্য কী:
exec "command";
এবং
system("command");
এবং
print `command`;
শেল কমান্ড চালানোর অন্যান্য উপায় আছে কি?
উত্তর:
একটি আদেশ কার্যকর করে এবং কখনই ফিরে আসে না । এটি 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
আপনি যদি উইন্ডোতে থাকেন।
সাধারণ আমি ব্যবহারের ইন 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: $!";
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>;
IPC::Open3
আপনি যখন প্রক্রিয়াটির তিনটি স্ট্যান্ডার্ড ফাইল হ্যান্ডেলগুলি ক্যাপচার করতে চান তখন ব্যবহার করুন । আমি একটি উদাহরণ লিখব, তবে এটি বেশিরভাগভাবে আইপিসি :: ওপেন 2-তে একইভাবে কাজ করে তবে আর্গুমেন্ট এবং তৃতীয় ফাইল হ্যান্ডেলের সাথে কিছুটা আলাদা অর্ডার দিয়ে।
এক্সিকিউটিভ ফাংশন একটি সিস্টেম কমান্ড কার্যকর করে এবং কখনই ফিরে আসে না - আপনি যদি ফিরে চান তবে এক্সেকের পরিবর্তে সিস্টেম ব্যবহার করুন
প্রথমে একটি কাঁটাচামচ সম্পন্ন করা ব্যতীত এক্সিকিউটিভ লিস্টের মতো একই জিনিসটি করে এবং পিতামাতার প্রক্রিয়াটি শিশু প্রক্রিয়াটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।
এক্সিকিউটিভ এবং সিস্টেমের বিপরীতে , ব্যাকটিকগুলি আপনাকে ফেরত মান দেয় না তবে সংগ্রহ করা 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;
শেষ অবধি , আইপিসি :: সিপিএএন থেকে চালানোও দেখার মতো ...
পার্লের ব্যাকটিক্স ( `
) 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
এবং তারপরে চূড়ান্ত মুদ্রণ বিবৃতি দ্বারা মুদ্রিত হয়।
'এক্সিকিউটিভ' এবং 'সিস্টেমের' মধ্যে পার্থক্য হ'ল এক্সিকিউটর আপনার বর্তমান প্রোগ্রামকে 'কমান্ড' দিয়ে প্রতিস্থাপন করে এবং আপনার প্রোগ্রামে কখনও ফিরে আসে না। অন্যদিকে সিস্টেম কাঁটাচামচ করে 'কমান্ড' চালায় এবং 'কমান্ড' এর প্রস্থান স্থিতিটি চালু হয়ে গেলে ফিরে আসে। পিছনের টিকটি 'কমান্ড' চালায় এবং তারপরে স্ট্রিংটি স্ট্যান্ডার্ড করে উপস্থাপন করে (যা স্ক্রিনে প্রিন্ট করে থাকত)
শেল কমান্ডগুলি চালাতে আপনি পপেনও ব্যবহার করতে পারেন এবং আমি মনে করি একটি শেল মডিউল রয়েছে - 'শেল ব্যবহার করুন' যা আপনাকে সাধারণ শেল কমান্ডগুলির স্বচ্ছ অ্যাক্সেস দেয়।
আশা করি এটি আপনার জন্য এটি স্পষ্ট করে দেয়।
use Shell;
( search.cpan.org/dist/Shell/Shell.pm )? এটি ব্যাপকভাবে ইনস্টল করা হয়নি, বা এটি প্রশ্নটির জন্যও প্রযোজ্য নয় বলে আমি মনে করি ...