2010-02-09 5 views
8

क्या कोई एरलांग कॉल है जहां मैं Retval = subprocess:call(["cmd", "arg1", "arg2", "arg3"]) कर सकता हूं?क्या कोई एरलांग ओएस है: cmd समकक्ष जो एक कमांड के बजाय तारों की एक सूची लेता है?

यदि मैं निष्पादित करने के लिए एक जटिल कमांड का निर्माण कर रहा हूं, ओएस: cmd/1 के साथ यह गलतियों से बचने में आसान है। पाइथन की subprocess.call() विधि की तुलना करें जहां मैं स्ट्रिंग्स की एक सूची में पास करता हूं और जानता हूं कि यह सबप्रोसेस को शब्दशः पारित किया गया है, कुछ भी उलझन में नहीं है।

धन्यवाद।

उत्तर

7

यही वह है जो मैंने साथ किया है।

-module(mycmd). 
-export([cmd/2]). 

cmd(Cmd, Args) -> 
    Tag = make_ref(), 
    {Pid, Ref} = erlang:spawn_monitor(fun() -> 
      Rv = cmd_sync(Cmd, Args), 
      exit({Tag, Rv}) 
     end), 
    receive 
     {'DOWN', Ref, process, Pid, {Tag, Data}} -> Data; 
     {'DOWN', Ref, process, Pid, Reason} -> exit(Reason) 
    end. 

cmd_sync(Cmd, Args) -> 
    P = open_port({spawn_executable, os:find_executable(Cmd)}, [ 
      binary, use_stdio, stream, eof, {args, Args}]), 
    cmd_receive(P, []). 

cmd_receive(Port, Acc) -> 
    receive 
     {Port, {data, Data}} -> cmd_receive(Port, [Data|Acc]); 
     {Port, eof}   -> {ok, lists:reverse(Acc)} 
    end. 
0

क्या आप अभी os:cmd(string:join(["cmd", "arg1", "arg2"], " ")) नहीं कर सकते हैं?

+2

यह समस्या का समाधान नहीं करता है, जो कि ओएस को दिया गया स्ट्रिंग है: cmd/1 को एक खोल द्वारा संसाधित किया जाएगा। यह चीजों को सिस्टम-निर्भर तरीके से विस्तारित करेगा। उदाहरण के लिए, ओएस: cmd ("echo 'हैलो'") एकल उद्धरण के बिना हैलो को echo कमांड को पास करेगा। इस तरह की चीज को सही तरीके से प्राप्त करना मुश्किल है ताकि प्रोग्राम को एर्लंग पक्ष पर आपके समान तर्क तर्क मिल जाए। आपको बिना किसी शेल के प्रोग्राम को चलाने के लिए एक माध्यम की जरूरत है। – RichardC

7

आजकल आप open_port({spawn_executable, Command}, [{args, [A1, ..., An]}]) कर सकते हैं, लेकिन अभी तक ओएस मॉड्यूल में इसके लिए कोई सुविधाजनक रैपर नहीं है। आप os:cmd/1 के लिए कोड ले सकते हैं और spawn_executable का उपयोग करने के लिए इसे ट्वीक कर सकते हैं। अधिक जानकारी के लिए के लिए दस्तावेज़ों की जांच करें।

संबंधित मुद्दे

 संबंधित मुद्दे