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 |
一個邏輯的(不是 |
ignore.stdout , ignore.stderr |
一個邏輯的(不是 |
wait |
一個邏輯的(不是 |
input |
如果提供了字符向量,則每行將一個字符串複製到臨時文件,並且 |
timeout |
超時(以秒為單位),如果為 0,則忽略。這是在單獨進程中運行 |
receive.console.signals |
一個邏輯的(不是 |
show.output.on.console , minimized , invisible |
在 Windows 上接受但在此平台上忽略的參數,並帶有警告。 |
細節
多年來,這個接口變得相當複雜:請參閱system2
以獲得更便攜、更靈活的接口,推薦用於新代碼。
command
被解析為命令加上由空格分隔的參數。因此,如果命令的路徑(或單個參數,例如文件路徑)包含空格,則必須用引號引起來,例如經過shQuote
。類 Unix 係統將命令行傳遞給 shell(通常是‘/bin/sh’,並且 POSIX 需要該 shell),所以command
可以是 shell 認為可執行的任何內容,包括 shell 腳本,並且它可以包含多個命令,用;
.
在 Windows 上,system
不使用 shell,並且有一個單獨的函數 shell
將命令行傳遞給 shell。
如果intern
是TRUE
然後popen
用於調用命令並將輸出逐行收集到R
character
向量。如果intern
是FALSE
然後是C函數system
用於調用命令。
wait
是通過將 &
附加到命令來實現的:這原則上是 shell-dependent,但 POSIX 要求並因此得到廣泛支持。
當timeout
不為零時,命令將在給定秒數後終止。終止適用於典型命令,但不能保證:可以編寫一個在超時後繼續運行的程序。超時隻能使用 wait = TRUE
設置。
超時不能與交互式命令一起使用:該命令使用從“重定向”的標準輸入運行/dev/空’並且不得修改終端設置。隻要有ttytostop
選項被禁用,通常默認情況下是禁用的,執行的命令可能會寫入標準輸出和標準錯誤。不能指望子進程的執行時間會包含在其中user.child
和sys.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 shellcmd.exe
,它與 POSIX shell 有很多區別)。這意味著不能假設重定向或管道在
system
中起作用(重定向有時會起作用,但我們已經看到在 Windows 安全補丁後它停止工作的情況),並且system2
(或shell
)必須是在 Windows 上使用。 -
會發生什麽
stdout
和stderr
何時未被捕獲取決於如何捕獲R正在運行:Windows 批處理命令的行為與 Unix 類似,但從 Windows GUI 中它們通常會丟失。system(intern = TRUE)
捕獲‘標準錯誤' 當從 Windows GUI 控製台運行時,除非ignore.stderr = TRUE
. -
錯誤時的行為有微妙的不同(並且在R版本)。
-
command
的引用約定有所不同,但shQuote
是一個可移植接口。 -
參數
show.output.on.console
、minimized
、invisible
僅在 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 system
和 man sh
了解如何在正在使用的操作係統上實現這一點。
.Platform
用於特定於平台的變量。
pipe
設置管道連接。
相關用法
- R system.file 查找 R 係統文件的名稱
- R system.time 使用的 CPU 時間
- R system2 調用係統命令
- R sys.parent 訪問函數調用堆棧的函數
- R sys.source 解析和評估文件中的表達式
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R search 給出 R 對象的搜索路徑
- R solve 求解方程組
- R scan 讀取數據值
- R sprintf 使用 C 風格字符串格式化命令
- R stop 停止函數執行
- R sign 標誌函數
- R svd 矩陣的奇異值分解
- R strtoi 將字符串轉換為整數
- R source 從文件、連接或表達式中讀取 R 代碼
- R sQuote 引用文字
- R switch 選擇替代方案列表之一
- R substitute 替換和引用表達式
- R strrep 重複字符向量的元素
- R split 分組並重新集合
- R slice.index 數組中的切片索引
- R sort 對向量進行排序或排序
- R standardGeneric 形式化方法係統 – 調度 S4 方法
- R sequence 創建序列向量
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Invoke a System Command。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。