PHP shell_exec () बनाम निष्पादन ()


345

के बीच अंतर को समझने के लिए संघर्ष कर रहा हूँ shell_exec()और exec()...

मैंने हमेशा exec()सर्वर साइड कमांड निष्पादित करने के लिए उपयोग किया है, मैं कब उपयोग करूंगा shell_exec()?

के लिए shell_exec()सिर्फ एक आशुलिपि है exec()? यह कम मापदंडों के साथ एक ही बात लगती है।


2
मतभेदों को देखने के लिए अच्छा उदाहरण इन आदेशों की कोशिश करने के लिए है: date, whoami, ifconfig, netstat

अन्य कार्य भी हैं: सिस्टम (), पस्स्त्रु () ... इस संबंधित प्रश्न को देखें , और विशेष रूप से इस उत्तर में
ग्रास डबल

जवाबों:


353

shell_exec एक स्ट्रिंग के रूप में आउटपुट स्ट्रीम के सभी देता है। execडिफ़ॉल्ट रूप से आउटपुट की अंतिम पंक्ति देता है, लेकिन दूसरे पैरामीटर के रूप में निर्दिष्ट सरणी के रूप में सभी आउटपुट प्रदान कर सकता है।

देख


21
यदि आपको बाहर निकलने-मूल्य और सभी आउटपुट की आवश्यकता है, तो आप शायद "शेल_सेक्स" के बजाय "निष्पादन" का उपयोग करना बेहतर है। जैसे ही आप आउटपुट पैरामीटर को "निष्पादित" करने के लिए पास करते हैं, यह आउटपुट की हर पंक्ति से भरा होगा, यह मुझे "
निष्पादित

4
@ daniel-a-white मुझे पता है कि यह एक पुराना है, लेकिन यह लोकप्रिय है, इसलिए आपको @preexo - द्वारा निष्पादित टिप्पणी को प्रतिबिंबित करने के लिए अपने उत्तर को संपादित करना चाहिए - निष्पादन () यदि आप अपने वैकल्पिक मापदंडों का उपयोग करते हैं तो पूरे आउटपुट को वापस करने की क्षमता है । इसके अलावा, असंबंधित, किसी को दो आदेशों को देखने के लिए बेंचमार्क चाहिए जो बेहतर है क्योंकि @preexo ने कहा " ऐसा लगता है कि मैं exec()कर सकता हूं [सब कुछ shell_exec()[कर सकता हूं] ] और अधिक :) "
SimpleAnecdote

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अंतिम पंक्ति रिक्त होती है।


क्या होता है अगर कमांड के साथ एक त्रुटि होती है ..? मुझे त्रुटि मिल रही है / ऐसी कोई फ़ाइल या निर्देशिका नहीं है लेकिन मैं इसे एक चर पर कैसे कब्जा कर सकता हूं ????
हैप्पी कोडर

@AlwinAugustin: हुह? एसटीडीआरआर को लिखा जा सकता है। 2>&1यदि आप एक linux मशीन पर हैं, तो STDER से STDERR को पुनर्निर्देशित करने के लिए अपने कमांड के अंत में जोड़ने का प्रयास करें ।
मपेन

मैंने इसे भी जोड़ा है। लेकिन फिर भी मुझे मूल्य के रूप में 0 मिल रहा है। मैंने एक wl -l कमांड का उपयोग किया है और यदि फ़ाइल नहीं है, तो मुझे त्रुटि संदेश प्राप्त करने की आवश्यकता है, ऐसी कोई फ़ाइल या निर्देशिका नहीं।
हैप्पी कोडर

50

shell_exec- शेल के माध्यम से कमांड निष्पादित करें और एक स्ट्रिंग के रूप में पूरा आउटपुट लौटाएं

exec - एक बाहरी कार्यक्रम निष्पादित करें।

अंतर यह है कि shell_execआपको रिटर्न वैल्यू के रूप में आउटपुट मिलता है।


4
अच्छा रसीला सारांश! यह अभी भी ध्यान दिया जाना चाहिए कि execआउटपुट की अंतिम पंक्ति लौटाता है। यदि वांछित है, तो आप वैकल्पिक रूप से एक सरणी में पूर्ण आउटपुट पर कब्जा करने के लिए दूसरे पैरामीटर के रूप में पास कर सकते हैं, और शेल कमांड के रिटर्न मान को कैप्चर करने के लिए तीसरे पैरामीटर के रूप में एक पूर्णांक है, जो त्रुटि जांच के लिए उपयोग किया जा सकता है। इसका सबसे बड़ा नकारात्मक पहलू shell_execयह है कि यदि कमांड विफल हो जाता है या यदि वह कोई आउटपुट नहीं देता है, तो यह अशक्त हो जाता है, इसलिए इसका रिटर्न मान मज़बूती से त्रुटि जाँच के लिए उपयोग नहीं किया जा सकता है।
बीन

38

कुछ भेद जो यहां नहीं थे:

  • निष्पादन () के साथ, आप एक वैकल्पिक पैराम चर पारित कर सकते हैं जो आउटपुट लाइनों की एक सरणी प्राप्त करेगा। कुछ मामलों में यह समय बचा सकता है, खासकर यदि कमांड का आउटपुट पहले से ही सारणीबद्ध है।

की तुलना करें:

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

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

इसके विपरीत, यदि कमांड का आउटपुट xml या json है, तो ऐरे के प्रत्येक भाग के रूप में प्रत्येक पंक्ति में वह नहीं है जो आप चाहते हैं, जैसा कि आपको इनपुट को किसी अन्य रूप में पोस्ट-प्रोसेस करने की आवश्यकता होगी, इसलिए उस स्थिति में shell_exec का उपयोग करें ।

यह भी इंगित करने के लायक है कि शेल_एक्सईसी बैकटिक ऑपरेटर के लिए एक उपनाम है, जो कि * निक्स के लिए उपयोग किया जाता है।

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

निष्पादन अतिरिक्त पैरामीटर का भी समर्थन करता है जो निष्पादित कमांड से रिटर्न कोड प्रदान करेगा:

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

जैसा कि shell_exec मैन्युअल पृष्ठ में नोट किया गया है, जब आपको वास्तव में निष्पादित किए जा रहे कमांड से रिटर्न कोड की आवश्यकता होती है, तो आपके पास निष्पादन का उपयोग करने के अलावा कोई विकल्प नहीं होता है।


3
इसके अतिरिक्त: execआपको कमांड का रिटर्न कोड प्राप्त होता है ( &$return_varपैरामीटर के माध्यम से ), जबकि shell_execइसे प्राप्त करने का कोई तरीका प्रदान नहीं करता है।
मार्क ऐमी

यद्यपि स्वीकृत उत्तर भी सही है, मेरी राय में यह उत्तर अधिक महत्वपूर्ण है। शायद सबसे अच्छा जवाब दोनों का संयोजन होगा।
20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.