Cp
CP:複製實用程序的最大源文件數量參數
考慮到 /src/ 下有無數個文件
cp /src/* /dst/
有多少文件
cp
將成功處理?
這在很大程度上取決於系統和版本、參數的數量和大小以及環境變數名稱的數量和大小。
傳統上,在 Unix 上,限制(如 所報告的
getconf ARG_MAX
)或多或少取決於以下各項的累積大小:
- 參數字元串的長度(包括終止符
'\0'
)- 指向這些字元串的指針數組的長度,因此通常在 64 位系統上每個參數 8 個字節
- 環境字元串(包括終止符)的長度,按照
'\0'
約定,環境字元串類似於var=value
.- 指向這些字元串的指針數組的長度,因此通常在 64 位系統上每個參數 8 個字節
請記住,這
cp
也算作一個論點(是第一個論點)。在 Linux 上,這取決於版本。那裡的行為最近發生了變化,不再是固定空間。
檢查 Linux 3.11,
getconf ARG_MAX
現在報告堆棧大小限制的四分之一,如果小於 512kiB,則為 128kiB)。(
zsh
下面的語法):$ limit stacksize stacksize 8MB $ getconf ARG_MAX 2097152 $ limit stacksize 4M $ getconf ARG_MAX 1048576
該限制是參數和環境字元串的累積大小以及一些成本(我懷疑是由於頁面邊界上的對齊考慮)。不考慮指針的大小。
尋找極限,我得到:
$ /bin/true {1..164686} $ /bin/true {1..164687} zsh: argument list too long: /bin/true $ x= /bin/true {1..164686} $ x=1 /bin/true {1..164686} zsh: argument list too long: /bin/true
在這種情況下,中斷前的最大累積大小為:
$ (env _=/bin/true x=;print -l /bin/true {1..164686}) | wc -c 1044462
現在,這並不意味著您可以傳遞 100 萬個空參數。在 64 位系統上,100 萬個空參數構成一個 8MB 的指針列表,這將超過我的 4MiB 堆棧大小。
$ IFS=:; /bin/true ${=${(l[1000000][:])}} zsh: killed /bin/true ${=${(l[1000000][:])}}
(您會注意到這不是 E2BIG 錯誤。我不確定該程序在什麼時候被殺死,儘管它是否在
execve
系統呼叫中或更高版本中)。另請注意(仍然在 Linux 3.11 上)單個參數或環境字元串的最大大小為 128kiB,無論堆棧大小如何。
$ /bin/true ${(l[131071][a])} # 131072 OK $ /bin/true ${(l[131072][a])} # 131073 not zsh: argument list too long: /bin/true $ /bin/true ${(l[131071][a])} ${(l[131071][a])} # 2x 131072 OK