我想通过我的Elixir代码执行一个程序。调用shell命令给定字符串的方法是什么?有什么不是平台特定的吗?
Answers:
System.cmd / 3似乎以列表形式接受命令的参数,并且当您尝试潜入命令名称中的参数时不满意。例如
System.cmd("ls", ["-al"]) #works, while
System.cmd("ls -al", []) #does not.
实际上,在下面发生的是System.cmd / 3调用第一个参数:os.find_executable / 1,它对于像ls这样的东西工作正常,但是对于ls -al返回false。
erlang调用需要一个char列表,而不是二进制列表,因此您需要以下内容:
"find /tmp -type f -size -200M |xargs rm -f" |> String.to_char_list |> :os.cmd
我不能直接链接到相关的文件,但它是在这里下System
模块
cmd(command) (function) #
Specs:
cmd(char_list) :: char_list
cmd(binary) :: binary
Execute a system command.
Executes command in a command shell of the target OS, captures the standard output of the command and returns the result as a binary.
If command is a char list, a char list is returned. Returns a binary otherwise.
如果我在文件中有以下c程序a.c
:
#include <stdio.h>
#include <stdlib.h>
int main(int arc, char** argv)
{
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
return num1*num2;
}
并将程序编译为文件a
:
~/c_programs$ gcc a.c -o a
然后我可以做:
~/c_programs$ ./a 3 5
3
5
我可以这样获得main()的返回值:
~/c_programs$ echo $?
15
同样,iex
我可以这样做:
iex(2)> {output, status} = System.cmd("./a", ["3", "5"])
{"3\n5\n", 15}
iex(3)> status
15
System.cmd()返回的元组的第二个元素是main()函数的返回值。
System.cmd/1
来自适用于Elixir字符串的Erlang。:)