bash 檔名擴充(通配符)是否有最大限制?

bash 檔名擴充(通配符)是否有最大限制?

bash 檔名擴充(通配符)是否有最大限制?看通配在 tldp.org 上。

假設我想對文件子集運行命令:

grep -e bar foo*
rm -f bar*

bash 擴充的檔案數量是否有限制?

我並不是在尋找執行這些操作的替代方法(例如使用find)。

答案1

glob 可以擴充的檔案數量沒有限制(可用記憶體除外)bash

但是,當這些文件作為參數傳遞給命令時,被處決(與 shell 內建函數或函數相反),那麼您可能會execve()在某些系統上遇到系統呼叫的限制。在大多數系統上,該系統呼叫對傳遞給它的參數和環境的累積大小有限制,並且在 Linux 上對單一參數的大小也有單獨的限制。

有關更多詳細信息,請參閱:

要解決該限制,您可以使用(假設 GNUxargs或相容):

printf '%s\0' foo* | xargs -r0 rm -f

上面,因為printf是內建的(在bash大多數類似 Bourne 的 shell 中),所以我們沒有達到極限execve()。並將根據需要xargs將參數列表拆分為盡可能多的rm呼叫以避免execve()限制。

zsh

autoload zargs
zargs foo* -- rm -f

ksh93

command -x rm -f foo*

答案2

您可以使用以下命令查看參數總大小的限制:

getconf ARG_MAX

這通常不是由 shell 決定的,而是由底層作業系統決定的,根據這個答案

相關內容