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


Ruby Kernel.exec用法及代碼示例


本文簡要介紹ruby語言中 Kernel.exec 的用法。

用法

exec([env,] command... [,options])

通過運行給定的外部 command 替換當前進程,它可以采用以下形式之一:

exec(commandline)

傳遞給標準 shell 的命令行字符串

exec(cmdname, arg1, ...)

命令名稱和一個或多個參數(無 shell )

exec([cmdname, argv0], arg1, ...)

命令名稱,argv 和零個或多個參數(無 shell )

在第一種形式中,字符串被視為命令行,在執行之前需要進行 shell 擴展。

標準 shell 在類 Unix 係統上始終表示 "/bin/sh",否則在 Windows 及類似係統上表示 ENV["RUBYSHELL"]ENV["COMSPEC"]。該命令作為參數傳遞給 shell 的 "-c" 開關,COMSPEC 的情況除外。

如果第一種形式的字符串 (exec("command")) 遵循以下簡單規則:

  • 沒有元字符

  • 不以 shell 保留字或特殊內置字開頭

  • Ruby 直接調用命令,無需 shell

您可以通過將“;” 添加到字符串來強製調用shell(因為“;” 是一個元字符)。

請注意,此行為可通過獲得的 pid 觀察到(spawn() 和 IO#pid 的返回值 IO.popen )是調用命令的 pid,而不是 shell。

在第二種形式(exec("command1", "arg1", ...))中,第一種形式作為命令名,其餘的作為參數傳遞給命令,沒有 shell 擴展。

第三種形式(exec(["command", "argv0"], "arg1", ...)),在命令開頭開始一個二元素數組,第一個元素是要執行的命令,第二個參數作為argv[0]的值,可能會出現在進程列表中。

為了執行命令,使用了exec(2)係統調用之一,因此運行命令可能會繼承原程序的一些環境(包括打開的文件說明符)。

此行為由給定的 envoptions 參數修改。有關詳細信息,請參見::spawn。

如果命令執行失敗(通常是 Errno::ENOENT 時未找到),則會引發 SystemCallError 異常。

此方法在exec(2) 係統調用之前根據給定的options 修改進程屬性。有關給定 options 的更多詳細信息,請參見::spawn。

exec(2) 係統調用失敗時,修改後的屬性可能會被保留。

例如,硬資源限製是不可恢複的。

如果不可接受,請考慮使用::spawn 或 Kernel#system 創建子進程。

exec "echo *"       # echoes list of files in current directory
# never get here

exec "echo", "*"    # echoes an asterisk
# never get here

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Kernel.exec。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。