在长生不老药中运行 shell 命令

我想通过我的长生不老药代码执行一个程序。对给定的字符串调用 shell 命令的方法是什么?还有什么不是平台特有的吗?

36225 次浏览

你可以看一下 Erlang os 模块,例如 cmd(Command) -> string()应该就是你要找的。

我不能直接链接到相关文档,但它是 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.

“ devinus/sh”库是另一种运行 shell 命令的有趣方法。

Https://github.com/devinus/sh

下面是如何在没有参数的情况下执行一个简单的 shell 命令:

System.cmd("whoami", [])
# => {"lukas\n", 0}

有关更多信息,请查阅有关 System的文档。

Cmd/3似乎将命令的参数作为列表接受,并且当您试图在命令名中插入参数时,它会感到不高兴。 比如说

System.cmd("ls", ["-al"]) #works, while
System.cmd("ls -al", []) #does not.

实际上在下面发生的是 System.cmd/3调用: os.find _ Executive/1和它的第一个参数,对于 ls 这样的参数可以正常工作,但是对于 ls-al 则返回 false。

Erlang 调用需要一个字符列表而不是二进制,因此您需要如下所示:

"find /tmp -type f -size -200M |xargs rm -f" |> String.to_char_list |> :os.cmd

如果在 a.c文件中有以下 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 ()函数的返回值。

也可以这样使用 erlang 的 :os模块:

iex(3)> :os.cmd('time')
'\nreal\t0m0.001s\nuser\t0m0.000s\nsys\t0m0.000s\n'

注意,例如,在处理结果 :os.cmd('time') |> to_string()时,必须处理 erlang 二进制文件