当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir System.cmd用法及代码示例


Elixir语言中 System.cmd 相关用法介绍如下。

用法:

cmd(command, args, opts \\ [])
@spec cmd(
  binary(),
  [binary()],
  keyword()
) :: {Collectable.t(), exit_status :: non_neg_integer()}

使用 args 执行给定的 command

command 应该是 PATH 中可用的可执行文件,除非给出绝对路径。

args 必须是可执行文件将按原样作为其参数接收的二进制文件列表。这意味着:

  • 环境变量不会被插值
  • 不会发生通配符扩展(除非明确使用 Path.wildcard/2 )
  • 为了 shell 安全,不需要对参数进行转义或引用

该函数返回一个包含收集结果和命令退出状态的元组。

在内部,此函数使用 Port 与外界交互。但是,如果您计划运行long-running 程序,端口保证标准输入/标准输出设备将被关闭,但它不会自动终止程序。 Port 模块的文档在"Zombie processes" 部分说明了这个问题和可能的解决方案。

例子

iex> System.cmd("echo", ["hello"])
{"hello\n", 0}

iex> System.cmd("echo", ["hello"], env: [{"MIX_ENV", "test"}])
{"hello\n", 0}

如果您想在输出到达时将输出流式传输到标准 IO:

iex> System.cmd("echo", ["hello"], into: IO.stream())
hello
{%IO.Stream{}, 0}

选项

  • :into - 将结果注入给定的收藏品,默认为 ""
  • :cd - 运行命令的目录
  • :env - 包含环境键值作为二进制的元组的可枚举。子进程从其父进程 Elixir 应用程序继承所有环境变量,使用此选项覆盖或清除的变量除外。指定值 nil 以清除(取消设置)环境变量,这对于防止传递给应用程序的凭据泄漏到子进程中很有用。
  • :arg0 - 设置命令 arg0
  • :stderr_to_stdout - 当 true 时将标准错误重定向到标准输出
  • :parallelism - 当 true 时,VM 将调度端口任务以提高系统中的并行性。如果设置为 false ,VM 将尝试立即执行命令,以牺牲并行性为代价来改善延迟。通过将 "+spp" 参数传递给 --erl 可以在系统启动时设置默认值。

错误原因

如果给出了无效参数,则 ArgumentError System.cmd/3 引发。 System.cmd/3 还需要一组严格的选项,如果给出未知或无效选项,则会引发。

此外, System.cmd/3 可能会因以下详述的 POSIX 原因之一而失败:

  • :system_limit - Erlang 模拟器中的所有可用端口都在使用中

  • :enomem - 没有足够的内存来创建端口

  • :eagain - 没有更多可用的操作系统进程

  • :enametoolong - 给定的外部命令太长

  • :emfile - 没有更多可用的文件说明符(对于运行 Erlang 模拟器的操作系统进程)

  • :enfile - 文件表已满(针对整个操作系统)

  • :eacces - 命令不指向可执行文件

  • :enoent - 该命令未指向现有文件

shell 命令

如果您希望在 shell 中执行受信任的命令,使用管道、重定向等,请检查 shell/2

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 System.cmd(command, args, opts \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。