[Swift-devel] New built-in system, request for comments

Yadu Nand Babuji yadunand at uchicago.edu
Sat Apr 5 22:51:24 CDT 2014


I've committed the change for running the strings under bash, and wildcards
and pipes are working. I can now do bash one-liners neatly and I like that.

I tested with this :
string o[] = system("ls *.swift");
foreach t,i in o{
     tracef("o=%s\n",o[i]);
}

RunID: run021
Progress: Sat, 05 Apr 2014 22:49:15-0500
o=fail.swift
o=system.swift
o=shell.swift
o=t.swift
Final status:Sat, 05 Apr 2014 22:49:15-0500

while system("echo *.swift"); returns a single line which goes to tracef.
Like this :
RunID: run022
Progress: Sat, 05 Apr 2014 22:50:12-0500
o=fail.swift shell.swift system.swift t.swift
Final status:Sat, 05 Apr 2014 22:50:12-0500

-Yadu

On 04/05/2014 08:11 PM, Michael Wilde wrote:
>
> As I alluded to in a prior post (but didnt say clearly), Im in favor 
> of giving system a varying number of returns, something like:
>
> output = system("command");
> (output,error) = system("command");
> (output,error,rc) = system("command");
>
> Also letting output and error be either strings or string arrays.
>
> Not sure how much flexibility is best, though.
>
> Regarding treating function failures like app failures: I dont think 
> thats good in the case of functions.  Further, in the case of apps, we 
> have at least one user request to provide more flexible error handling 
> for app failures. So when the user requests an rc (from either), any 
> non-zero RC should be returned to the user and not cause the function 
> (app or built-in) to be considered failed. Null files can be returned 
> to preserve dataflow semantics.  This is not totally clear, and not 
> clearly "best", but should should consider it.
>
> Yadu, regarding the current implementation: I was about to send a note 
> to swift-user when I decided to test it first.  Im getting strange 
> errors when I try to do:
>
> string o[] = system("echo *.swift");
> tracef("o=%s\n",o[0]);
> # produces:
> o=*.swift
>
> string o[] = system("sh -c 'echo *.swift'");
> tracef("o=%s\n",o[0]);
>
> # produces:
> swift:system returned exitcode :1
> swift:system stderr:
>  *.swift': -c: line 0: unexpected EOF while looking for matching 
> `''*.swift': -c: line 1: syntax error: unexpected end of file
>
> Execution failed:
> java.lang.IndexOutOfBoundsException: Invalid index [0] for o
>     tracef @ system, line: 28
> Caused by: java.lang.IndexOutOfBoundsException: Invalid index [0] for o
>
> ---
>
> Yet:
> string o[] = system("sh -c 'date'");
> tracef("o=%s\n",o[0]);
> # produces:
> o=Sat Apr  5 20:08:29 CDT 2014
>
> So something strange is happening when I try to pass an argument with 
> shell wildcard chars to "sh -c".
>
> I think that system( ) by default should send its args to "sh -c" so 
> that wildcards and all related shell features are available.
>
> Lastly, note that in above, "echo" is just an experiment; what I 
> really want to do in this example is "/bin/ls -1 *.swift" for example.
>
> - Mike
>
>
> On 4/5/14, 7:01 PM, Yadu Nand Babuji wrote:
>> Ketan,
>>
>> Do we need that ? If you add stdout, stderr and say exitcode as 
>> returns, the user has no
>> choice but to define variables to hold those return values.
>>
>> Mihael mentioned in a separate thread that the behavior should be to 
>> fail early in case the
>> executed string returns a non-zero exitcode.
>>
>> -Yadu
>>
>> On 04/04/2014 10:58 PM, Ketan Maheshwari wrote:
>>> Is it possible to handle stdout and/or stderr of system("command") 
>>> separately? That way, it might be useful in other places as well.
>>>
>>>
>>> On Fri, Apr 4, 2014 at 12:08 PM, Yadu Nand <yadudoc1729 at gmail.com 
>>> <mailto:yadudoc1729 at gmail.com>> wrote:
>>>
>>>     Hi,
>>>
>>>     I have just added a new builtin "system" to trunk. It takes a
>>>     string,
>>>     which is executed in the shell
>>>     by java and the results are returned as an array. This is done
>>>     to make
>>>     mappings easier, for example,
>>>     you can map an entire folder "foo" using the following :
>>>
>>>     file folder[ ] < array_mapper; files = system ("find foo -type
>>>     f") >;
>>>
>>>     If the execution of the string provided fails, the logger would
>>>     report
>>>     the the exitcode and stderr to
>>>     the swift stdout.
>>>
>>>     Thanks,
>>>     Yadu Nand B
>>>     _______________________________________________
>>>     Swift-devel mailing list
>>>     Swift-devel at ci.uchicago.edu <mailto:Swift-devel at ci.uchicago.edu>
>>>     https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Swift-devel mailing list
>>> Swift-devel at ci.uchicago.edu
>>> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel
>>
>>
>>
>> _______________________________________________
>> Swift-devel mailing list
>> Swift-devel at ci.uchicago.edu
>> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel
>
> -- 
> Michael Wilde
> Mathematics and Computer Science          Computation Institute
> Argonne National Laboratory               The University of Chicago
>
>
> _______________________________________________
> Swift-devel mailing list
> Swift-devel at ci.uchicago.edu
> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/swift-devel/attachments/20140405/8534576a/attachment.html>


More information about the Swift-devel mailing list