檢視原始碼 os (核心 v10.2)
作業系統特定函式。
此模組中的函式是作業系統特定的。不小心使用這些函式會導致程式只能在特定平台上執行。另一方面,如果小心使用,這些函式可以幫助程式在大多數平台上執行。
注意
如果此模組中的函式的引數包含「資料類型」章節中描述的無效字元,則會引發
badarg
例外。
摘要
類型
一個字串,包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數名稱的有效字元。
假設環境變數已正確設定,則字串包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數名稱和值的有效字元。
一個字串,包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數值的有效字元。
所有字元都必須是特定作業系統上使用 file:native_name_encoding()
編碼的有效字元。不允許空字元(整數值為零)。
函式
在目標作業系統的命令殼層中執行 Command
,捕獲命令的標準輸出和標準錯誤,並將此結果以字串形式傳回。
傳回所有環境變數的清單。每個環境變數都表示為元組 {VarName,Value}
,其中 VarName
是變數的名稱,而 Value
是其值。
等同於 find_executable(Name, Path)
,其中 Path
是目前的執行路徑(即 Unix 和 Windows 上的環境變數 PATH
)。
以與基礎作業系統相同的方式,使用指定的名稱和搜尋路徑來查詢可執行的程式。
傳回所有環境變數的清單。每個環境變數都以單一字串格式 "VarName=Value"
表示,其中 VarName
是變數的名稱,而 Value
是其值。
傳回環境變數 VarName
的 Value
,如果未定義環境變數,則傳回 false
。
傳回環境變數 VarName
的 Value
,如果未定義環境變數,則傳回 DefaultValue
。
以作業系統環境最常用的格式傳回目前 Erlang 模擬器的處理序識別碼。
以 perf_counter
時間單位 傳回目前的效能計數器值。這是一個高度最佳化的呼叫,可能無法追蹤。
傳回可用作非常快速且高解析度時間戳記的效能計數器。
為環境變數 VarName
設定新的 Value
。
啟用或停用作業系統訊號。
傳回轉換為以引數傳遞的 Unit
的目前 作業系統系統時間。
以與 erlang:timestamp/0
相同的格式傳回目前的 作業系統系統時間。
傳回目前作業系統的 Osfamily
,在某些情況下,也傳回 Osname
。
刪除環境變數 VarName
。
傳回作業系統版本。在大多數系統上,此函式會傳回元組,但如果系統的版本無法表示為三個數字,則會改為傳回字串。
類型
-type env_var_name() :: nonempty_string().
一個字串,包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數名稱的有效字元。
不允許空字元(整數值為零)。在 Unix 上,不允許 =
字元。在 Windows 上,僅允許 =
字元作為字串中的第一個字元。
-type env_var_name_value() :: nonempty_string().
假設環境變數已正確設定,則字串包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數名稱和值的有效字元。
字串中出現的第一個 =
字元將環境變數名稱(在左側)與環境變數值(在右側)分開。
-type env_var_value() :: string().
一個字串,包含特定作業系統上使用 file:native_name_encoding()
編碼的環境變數值的有效字元。
不允許空字元(整數值為零)。
-type os_command() :: atom() | io_lib:chars().
所有字元都必須是特定作業系統上使用 file:native_name_encoding()
編碼的有效字元。不允許空字元(整數值為零)。
-type os_command_opts() :: #{max_size => non_neg_integer() | infinity}.
os:cmd/2
的選項。
函式
-spec cmd(Command) -> string() when Command :: os_command().
等同於 cmd(Command, #{})
。
-spec cmd(Command, Options) -> string() when Command :: os_command(), Options :: os_command_opts().
在目標作業系統的命令殼層中執行 Command
,捕獲命令的標準輸出和標準錯誤,並將此結果以字串形式傳回。
可以使用 核心設定參數設定命令殼層,預設情況下,會在系統啟動時偵測殼層。
範例
LsOut = os:cmd("ls"), % on unix platform
DirOut = os:cmd("dir"), % on Win32 platform
請注意,在某些情況下,從另一個程式呼叫時的命令標準輸出,與直接從作業系統命令殼層呼叫時的命令標準輸出可能不同。
可能的選項是
max_size
-os:cmd
呼叫傳回的資料最大大小。當執行的命令可能傳回非常大(可能無限大)的結果時,應使用此選項作為安全功能。> os:cmd("cat /dev/zero", #{ max_size => 20 }). [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
-spec env() -> [{env_var_name(), env_var_value()}].
傳回所有環境變數的清單。每個環境變數都表示為元組 {VarName,Value}
,其中 VarName
是變數的名稱,而 Value
是其值。
如果 Unicode 檔案名稱編碼有效(請參閱 erl
手冊頁),則字串可以包含程式碼點 > 255 的字元。
等同於 find_executable(Name, Path)
,其中 Path
是目前的執行路徑(即 Unix 和 Windows 上的環境變數 PATH
)。
-spec find_executable(Name, Path) -> Filename | false when Name :: string(), Path :: string(), Filename :: string().
以與基礎作業系統相同的方式,使用指定的名稱和搜尋路徑來查詢可執行的程式。
Path
必須符合作業系統上的執行路徑語法。傳回可執行程式 Name
的絕對檔案名稱,如果找不到該程式,則傳回 false
。
-spec getenv() -> [env_var_name_value()].
傳回所有環境變數的清單。每個環境變數都以單一字串格式 "VarName=Value"
表示,其中 VarName
是變數的名稱,而 Value
是其值。
如果 Unicode 檔案名稱編碼有效(請參閱 erl
手冊頁),則字串可以包含程式碼點 > 255 的字元。
請考慮使用 env/0
以獲得更簡潔的 2 元組格式。
-spec getenv(VarName) -> Value | false when VarName :: env_var_name(), Value :: env_var_value().
傳回環境變數 VarName
的 Value
,如果未定義環境變數,則傳回 false
。
如果 Unicode 檔案名稱編碼有效(請參閱 erl
手冊頁),則字串 VarName
和 Value
可以包含程式碼點 > 255 的字元。
-spec getenv(VarName, DefaultValue) -> Value when VarName :: env_var_name(), DefaultValue :: env_var_value(), Value :: env_var_value().
傳回環境變數 VarName
的 Value
,如果未定義環境變數,則傳回 DefaultValue
。
如果 Unicode 檔案名稱編碼有效(請參閱 erl
手冊頁),則字串 VarName
和 Value
可以包含程式碼點 > 255 的字元。
-spec getpid() -> Value when Value :: string().
以作業系統環境最常用的格式傳回目前 Erlang 模擬器的處理序識別碼。
以字串形式傳回 Value
,其中包含處理序(通常是)數值識別碼。
- 在 Unix 上,這通常是
getpid/0
系統呼叫的傳回值。 - 在 Windows 上,使用
GetCurrentProcessId()
系統呼叫傳回的處理序識別碼。
-spec perf_counter() -> Counter when Counter :: integer().
以 perf_counter
時間單位 傳回目前的效能計數器值。這是一個高度最佳化的呼叫,可能無法追蹤。
-spec perf_counter(Unit) -> integer() when Unit :: erlang:time_unit().
傳回可用作非常快速且高解析度時間戳記的效能計數器。
此計數器直接從硬體或作業系統讀取,並具有相同的保證。這表示無法保證對函式的兩個連續呼叫是單調的,儘管它很可能是單調的。效能計數器將轉換為以引數傳遞的解析度。
1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
176525861
2> T2 - T1.
10004
-spec putenv(VarName, Value) -> true when VarName :: env_var_name(), Value :: env_var_value().
為環境變數 VarName
設定新的 Value
。
如果 Unicode 檔案名稱編碼有效(請參閱 erl
手冊頁),則字串 VarName
和 Value
可以包含程式碼點 > 255 的字元。
在 Unix 平台上,如果 Unicode 檔案名稱轉換有效,則會使用 UTF-8 編碼設定環境。在 Windows 上,會使用寬字元介面設定環境。
-spec set_signal(Signal, Option) -> ok
when
Signal ::
sighup | sigquit | sigabrt | sigalrm | sigterm | sigusr1 | sigusr2 |
sigchld | sigstop | sigtstp,
Option :: default | handle | ignore.
啟用或停用作業系統訊號。
每個訊號都可以設定為下列其中一個選項
ignore
- 將忽略此訊號。default
- 此訊號將使用作業系統的預設訊號處理常式。handle
- 當 Erlang 執行時間系統收到此訊號時,此訊號將通知erl_signal_server
。
-spec system_time() -> integer().
注意
此時間不是單調遞增的時間。
-spec system_time(Unit) -> integer() when Unit :: erlang:time_unit().
傳回轉換為以引數傳遞的 Unit
的目前 作業系統系統時間。
呼叫 os:system_time(Unit)
等同於 erlang:convert_time_unit
(os:system_time()
, native, Unit)
。
注意
此時間不是單調遞增的時間。
-spec timestamp() -> Timestamp when Timestamp :: erlang:timestamp().
以與 erlang:timestamp/0
相同的格式傳回目前的 作業系統系統時間。
此元組可以與函數 calendar:now_to_universal_time/1
或 calendar:now_to_local_time/1
一起使用,以取得日曆時間。使用日曆時間,以及此函數返回元組的 MicroSecs
部分,您可以記錄高解析度的時間戳記,並與作業系統其餘部分的時間保持一致。
程式碼範例,格式化一個 "DD Mon YYYY HH:MM:SS.mmmmmm" 格式的字串,其中 DD 是月份中的日期,Mon 是月份的文字名稱,YYYY 是年份,HH:MM:SS 是時間,而 mmmmmm 是六位數的微秒。
-module(print_time).
-export([format_utc_timestamp/0]).
format_utc_timestamp() ->
TS = {_,_,Micro} = os:timestamp(),
{{Year,Month,Day},{Hour,Minute,Second}} =
calendar:now_to_universal_time(TS),
Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
"Aug","Sep","Oct","Nov","Dec"}),
io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
[Day,Mstr,Year,Hour,Minute,Second,Micro]).
此模組可依如下方式使用
1> io:format("~s~n",[print_time:format_utc_timestamp()]).
29 Apr 2009 9:55:30.051711
作業系統系統時間也可以透過 system_time/0
和 system_time/1
取得。
-spec type() -> {Osfamily, Osname} when Osfamily :: unix | win32, Osname :: atom().
傳回目前作業系統的 Osfamily
,在某些情況下,也傳回 Osname
。
在 Unix 上,Osname
的值與 uname -s
返回的值相同,但為小寫。例如,在 Solaris 1 和 2 上,它是 sunos
。
在 Windows 上,Osname
為 nt
。
注意
使用此函數前請三思。如果您想以可攜式的方式檢查或建立檔案名稱,請使用模組
filename
。避免比對原子Osname
。
-spec unsetenv(VarName) -> true when VarName :: env_var_name().
刪除環境變數 VarName
。
如果 Unicode 檔案名稱編碼生效(請參閱 erl
手冊頁面),則字串 VarName
可以包含程式碼點 > 255 的字元。
-spec version() -> VersionString | {Major, Minor, Release} when VersionString :: string(), Major :: non_neg_integer(), Minor :: non_neg_integer(), Release :: non_neg_integer().
傳回作業系統版本。在大多數系統上,此函式會傳回元組,但如果系統的版本無法表示為三個數字,則會改為傳回字串。
注意
使用此函數前請三思。如果您仍然需要使用它,請務必先
call os:type()
。