當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。