本文簡要介紹ruby語言中 Process.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)
係統調用之一,因此運行命令可能會繼承原程序的一些環境(包括打開的文件說明符)。
此行為由給定的 env
和 options
參數修改。有關詳細信息,請參閱 ::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 Process.exit用法及代碼示例
- Ruby Process.exit!用法及代碼示例
- Ruby Process.euid用法及代碼示例
- Ruby Process.egid用法及代碼示例
- Ruby Process.groups用法及代碼示例
- Ruby Process.wait2用法及代碼示例
- Ruby Process.getpgrp用法及代碼示例
- Ruby Process.setproctitle用法及代碼示例
- Ruby Process.setrlimit用法及代碼示例
- Ruby Process.uid用法及代碼示例
- Ruby Process.pid用法及代碼示例
- Ruby Process.detach用法及代碼示例
- Ruby Process.maxgroups用法及代碼示例
- Ruby Process.clock_gettime用法及代碼示例
- Ruby Process.groups=用法及代碼示例
- Ruby Process.clock_getres用法及代碼示例
- Ruby Process.getsid用法及代碼示例
- Ruby Process.getpriority用法及代碼示例
- Ruby Process.times用法及代碼示例
- Ruby Process.getpgid用法及代碼示例
- Ruby Process.setpriority用法及代碼示例
- Ruby Process.kill用法及代碼示例
- Ruby Process.initgroups用法及代碼示例
- Ruby Process.spawn用法及代碼示例
- Ruby Process.last_status用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Process.exec。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。