পিএইচপি শেল_এক্সেক () বনাম এক্সিকিউট ()


345

আমি shell_exec()এবং exec()... এর মধ্যে পার্থক্য বুঝতে লড়াই করছি

আমি সর্বদা exec()সার্ভার সাইড কমান্ডগুলি কার্যকর করতে ব্যবহার করেছি , আমি কখন ব্যবহার করব shell_exec()?

কি shell_exec()শুধু জন্য একটি সাঁটে লেখার exec()? কম পরামিতি সহ এটি একই জিনিস বলে মনে হচ্ছে।


2
পার্থক্য দেখতে ভাল উদাহরণ এই কমান্ড চেষ্টা করা: date, whoami, ifconfig, netstat

এছাড়াও অন্যান্য ফাংশন রয়েছে: সিস্টেম (), পাস্ত্র্রু () ... এই সম্পর্কিত প্রশ্নটি দেখুন এবং বিশেষত এই উত্তরটি দেখুন
গ্রাস ডাবল

উত্তর:


353

shell_execআউটপুট স্ট্রিমের সমস্ত স্ট্রিং হিসাবে প্রদান করে। execডিফল্টরূপে আউটপুটটির শেষ লাইনটি প্রদান করে, তবে দ্বিতীয় প্যারামিটার হিসাবে নির্দিষ্ট অ্যারে হিসাবে সমস্ত আউটপুট সরবরাহ করতে পারে।

দেখা


21
আপনার যদি প্রস্থান মূল্য এবং সমস্ত আউটপুট প্রয়োজন হয় তবে আপনি সম্ভবত "শেল_এক্সেক" এর চেয়ে "এক্সিকিউট" ব্যবহার করা আরও ভাল। আউটপুট প্যারামিটারটি "এক্সিকিউটিভ" এ পাস করার সাথে সাথেই এটি আউটপুটটির প্রতিটি লাইন দিয়ে পূর্ণ হবে, এটি আমার কাছে মনে হয় "এক্সিকিউট" "শেল_এক্সেক" এবং আরও অনেক কিছু করতে পারে :)
প্রিক্সো

4
@ ড্যানিয়েল-এ-হোয়াইট আমি জানি এটি একটি পুরানো, তবে এটি জনপ্রিয় তাই আপনার নিজের উত্তরটি সম্পাদনা করা উচিত @ প্রিক্সোর মন্তব্যটি প্রতিফলিত করতে - এক্সিকিউটিভ () এর বিকল্পটি যদি আপনি এর বিকল্পগুলি ব্যবহার করেন তবে সম্পূর্ণ আউটপুট ফিরিয়ে আনার ক্ষমতাও রয়েছে । এছাড়াও, সম্পর্কযুক্ত নয়, কারও কাছে দুটি কমান্ডের বেঞ্চমার্ক করা উচিত যা ভালভাবে দেখার জন্য @ প্রিক্সো বলেছিলেন যে " এটি আমার কাছে সমস্ত exec()কিছু [করতে] shell_exec()[পারছে,] এবং আরও অনেক কিছু করতে পারে বলে মনে হচ্ছে :) "
সিম্পলএনডটোট

77

এখানে পার্থক্য রয়েছে। শেষে নিউলাইনগুলি নোট করুন।

> shell_exec('date')
string(29) "Wed Mar  6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar  6 14:18:12 PST 2013"

> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"

> shell_exec('ifconfig')
string(1244) "eth0      Link encap:Ethernet  HWaddr 10:bf:44:44:22:33  \n          inet addr:192.168.0.90  Bcast:192.168.0.255  Mask:255.255.255.0\n          inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n          TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:13151177627 (13.1 GB)  TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""

নোট করুন যে ব্যাকটিক অপারেটর ব্যবহার অনুরূপ shell_exec()

হালনাগাদ: আমার সত্যিই শেষটিটি ব্যাখ্যা করা উচিত। এই উত্তরগুলির দিকে কয়েক বছর পরেও আমি জানি না কেন এটি ফাঁকা বেরিয়েছে! ড্যানিয়েল উপরে এটি ব্যাখ্যা করেছেন - এটি কারণ execকেবল শেষ লাইনটি ফিরে আসে, এবং ifconfigশেষের লাইনটি ফাঁকা হয়ে যায়।


কমান্ড দিয়ে একটি ত্রুটি ঘটলে কি হয় ..? আমি ত্রুটি পাচ্ছি / এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই তবে আমি কীভাবে এটি একটি চলকতে ক্যাপচার করতে পারি ????
শুভ কোডার

@ আলউইন অগস্টিন: হু? এসটিডিআরআরে লেখা হতে পারে। আপনি 2>&1যদি কোনও লিনাক্স মেশিনে থাকেন তবে আপনার কমান্ডের শেষে যোগ করার চেষ্টা করুন STDERR কে STDOUT এ পুনর্নির্দেশ করতে।
এমপেন

আমি এটি যোগ করেছি। তবে তবুও আমি মান হিসাবে 0 পাচ্ছি। আমি একটি ডাব্লুসি-এল কমান্ড ব্যবহার করেছি এবং যদি ফাইলটি না থাকে তবে এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই বলে আমার ত্রুটি বার্তাটি পাওয়া দরকার।
শুভ কোডার

50

shell_exec- শেলের মাধ্যমে কমান্ড কার্যকর করুন এবং স্ট্রিং হিসাবে সম্পূর্ণ আউটপুট ফিরিয়ে দিন

exec - একটি বাহ্যিক প্রোগ্রাম কার্যকর করুন।

পার্থক্য হ'ল shell_execআপনার সাথে রিটার্ন মান হিসাবে আউটপুট পাওয়া যায়।


4
চমৎকার সংক্ষিপ্তসার সংক্ষিপ্তসার! এটি এখনও লক্ষ করা উচিত যে execআউটপুটের শেষ লাইনটি দেয়। যদি ইচ্ছা হয়, আপনি সম্পূর্ণ আউটপুট ক্যাপচার করতে দ্বিতীয় প্যারামিটার হিসাবে একটি অ্যারেতে এবং শেল কমান্ডের রিটার্ন মানটি অর্জন করতে তৃতীয় প্যারামিটার হিসাবে একটি পূর্ণসংখ্যা যা ত্রুটি পরীক্ষার জন্য ব্যবহার করা যেতে পারে pass সবচেয়ে বড় খারাপ দিক shell_execহ'ল এটি কমান্ডটি ব্যর্থ হলে বা যদি কোনও আউটপুট উত্পাদন না করে তবে এটি নালায় ফিরে আসে, সুতরাং এর রিটার্ন মানটি ত্রুটি পরীক্ষার জন্য নির্ভরযোগ্যভাবে ব্যবহার করা যায় না।
শিন দ্য বিয়ান

38

এখানে কয়েকটি বর্ণনাকে স্পর্শ করা হয়নি:

  • এক্সিকিউট () এর সাহায্যে আপনি একটি alচ্ছিক প্যারাম ভেরিয়েবল পাস করতে পারেন যা আউটপুট লাইনের একটি অ্যারে গ্রহণ করবে। কিছু ক্ষেত্রে এটি সময় সাশ্রয় করতে পারে, বিশেষত যদি কমান্ডগুলির আউটপুট ইতিমধ্যে সারণী হয়।

তুলনা করা:

exec('ls', $out);
var_dump($out);
// Look an array

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it

বিপরীতভাবে, যদি কমান্ডের আউটপুটটি এক্সএমএল বা জেসন হয়, তবে অ্যারের অংশ হিসাবে প্রতিটি লাইন থাকা আপনার পছন্দটি নয়, কারণ আপনাকে ইনপুটটিকে অন্য কোনও ফর্মের পরে পোস্ট-প্রসেস করতে হবে, সুতরাং সেই ক্ষেত্রে শেল_এক্সেক ব্যবহার করুন ।

এটি উল্লেখ করার মতোও যে শেল_এক্সেক একটি ব্যাকটিক অপারেটরের জন্য একটি নাম যা * নিক্স ব্যবহার করত।

$out = `ls`;
var_dump($out);

এক্সিকিউট একটি অতিরিক্ত প্যারামিটার সমর্থন করে যা এক্সিকিউটড কমান্ড থেকে রিটার্ন কোড সরবরাহ করবে:

exec('ls', $out, $status);
if (0 === $status) {
    var_dump($out);
} else {
    echo "Command failed with status: $status";
}

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


3
অতিরিক্তভাবে: execআপনাকে কমান্ডের রিটার্ন কোড ( &$return_varপ্যারামিটারের মাধ্যমে ) পেতে দেয়, যদিও shell_execএটি পাওয়ার কোনও উপায় সরবরাহ করে না।
মার্ক অ্যামেরিকে

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