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


R system 調用係統命令


R語言 system 位於 base 包(package)。

說明

system 調用command 指定的操作係統命令。

用法

system(command, intern = FALSE,
       ignore.stdout = FALSE, ignore.stderr = FALSE,
       wait = TRUE, input = NULL, show.output.on.console = TRUE,
       minimized = FALSE, invisible = TRUE, timeout = 0,
       receive.console.signals = wait)

參數

command

要調用的係統命令,作為字符串。

intern

一個邏輯的(不是NA) 指示是否將命令的輸出捕獲為R字符向量。

ignore.stdout , ignore.stderr

一個邏輯的(不是NA) 指示消息是否寫入‘標準輸出' 或者 '標準錯誤’應該被忽略。

wait

一個邏輯的(不是NA)表明是否R解釋器應該等待命令完成,或者異步運行它。如果出現以下情況,這將被忽略(並且解釋器將始終等待):intern = TRUE。異步運行該命令時,屏幕上不會顯示任何輸出RguiWindows 中的控製台(它將被刪除)。

input

如果提供了字符向量,則每行將一個字符串複製到臨時文件,並且 command 的標準輸入將重定向到該文件。

timeout

超時(以秒為單位),如果為 0,則忽略。這是在單獨進程中運行 command 所用時間的限製。秒的小數部分將被忽略。

receive.console.signals

一個邏輯的(不是NA)指示命令是否應該從終端/控製台接收事件R運行自,特別是是否應該被中斷Ctrl-C。這將被忽略,並且事件將始終被接收intern = TRUE或者wait = TRUE.

show.output.on.console , minimized , invisible

在 Windows 上接受但在此平台上忽略的參數,並帶有警告。

細節

多年來,這個接口變得相當複雜:請參閱system2以獲得更便攜、更靈活的接口,推薦用於新代碼。

command被解析為命令加上由空格分隔的參數。因此,如果命令的路徑(或單個參數,例如文件路徑)包含空格,則必須用引號引起來,例如經過shQuote。類 Unix 係統將命令行傳遞給 shell(通常是‘/bin/sh’,並且 POSIX 需要該 shell),所以command可以是 shell 認為可執行的任何內容,包括 shell 腳本,並且它可以包含多個命令,用;.

在 Windows 上,system 不使用 shell,並且有一個單獨的函數 shell 將命令行傳遞給 shell。

如果internTRUE然後popen用於調用命令並將輸出逐行收集到R character向量。如果internFALSE然後是C函數system用於調用命令。

wait 是通過將 & 附加到命令來實現的:這原則上是 shell-dependent,但 POSIX 要求並因此得到廣泛支持。

timeout 不為零時,命令將在給定秒數後終止。終止適用於典型命令,但不能保證:可以編寫一個在超時後繼續運行的程序。超時隻能使用 wait = TRUE 設置。

超時不能與交互式命令一起使用:該命令使用從“重定向”的標準輸入運行/dev/空’並且不得修改終端設置。隻要有ttytostop選項被禁用,通常默認情況下是禁用的,執行的命令可能會寫入標準輸出和標準錯誤。不能指望子進程的執行時間會包含在其中user.childsys.child的元素proc_time由返回proc.time。對於要包含的時間,所有子進程都必須等待其父進程,這必須在父應用程序中實現。

前兩個參數之後的參數順序有時會發生變化:建議將所有參數命名在第一個參數之後。

使用 system 來確定命令是否可以運行有很多陷阱 — Sys.which 更合適。

receive.console.signals = TRUE 在運行異步進程(使用 wait = FALSE )來實現同步操作時很有用。在所有其他情況下,建議使用默認值。

如果intern = TRUE,給出命令輸出的字符向量,每個字符串一行。 (在某些係統上,超過 8095 字節的輸出行將被分割。)如果該命令無法運行,R產生錯誤。如果command運行但給出非零退出狀態,這將在屬性中報告並帶有警告"status"結果的:一個屬性"errmsg"也可能可用。

如果intern = FALSE,返回值是錯誤代碼(0成功),給定不可見屬性(因此需要顯式打印)。如果該命令因任何原因無法運行,則該值為127並發出警告(從R3.5.0)。否則如果wait = TRUE該值是命令返回的退出狀態,如果wait = FALSE這是0(常規成功值)。

如果命令超時,則會報告警告,退出狀態為 124

標準輸出和標準錯誤

對於命令行R,錯誤消息寫入‘標準錯誤' 將被發送到終端,除非ignore.stderr = TRUE。它們可以被捕獲(在最有可能的殼中)

    system("some command 2>&1", intern = TRUE)

對於 GUI,發送到‘的輸出會發生什麽?標準輸出' 或者 '標準錯誤' 如果intern = FALSE是interface-specific,假設此類消息將出現在 GUI 控製台上是不安全的(它們出現在 macOS GUI 控製台上,但不會出現在其他一些控製台上)。

Unix 和 Windows 之間的差異

Windows 和類 Unix 操作係統之間的進程啟動方式存在根本差異,其上的高級操作係統函數也存在差異。R函數已構建。因此,操作係統之間在如何處理方麵存在許多差異也就不足為奇了。system行為。為了程序員的利益,本節總結了比較重要的內容。

  • 最重要的區別是,在類似 Unix 的 system 上啟動一個 shell,然後運行 command 。在 Windows 上,該命令直接運行 - 使用 shell 作為通過 shell 運行 command 的接口(默認情況下 Windows shell cmd.exe ,它與 POSIX shell 有很多區別)。

    這意味著不能假設重定向或管道在 system 中起作用(重定向有時會起作用,但我們已經看到在 Windows 安全補丁後它停止工作的情況),並且 system2 (或 shell )必須是在 Windows 上使用。

  • 會發生什麽stdoutstderr何時未被捕獲取決於如何捕獲R正在運行:Windows 批處理命令的行為與 Unix 類似,但從 Windows GUI 中它們通常會丟失。system(intern = TRUE)捕獲‘標準錯誤' 當從 Windows GUI 控製台運行時,除非ignore.stderr = TRUE.

  • 錯誤時的行為有微妙的不同(並且在R版本)。

  • command 的引用約定有所不同,但 shQuote 是一個可移植接口。

  • 參數 show.output.on.consoleminimizedinvisible 僅在 Windows 上執行某些操作(並且與那裏的 Rgui 最相關)。

例子

# list all files in the current directory using the -F flag
## Not run: system("ls -F")

# t1 is a character vector, each element giving a line of output from who
# (if the platform has who)
t1 <- try(system("who", intern = TRUE))

try(system("ls fizzlipuzzli", intern = TRUE, ignore.stderr = TRUE))
# zero-length result since file does not exist, and will give warning.

也可以看看

man systemman sh 了解如何在正在使用的操作係統上實現這一點。

.Platform 用於特定於平台的變量。

pipe 設置管道連接。

相關用法


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