“参数列表太长”限制是否适用于 shell 内建命令?
- 2024-10-25 08:42:00
- admin 原创
- 59
问题描述:
我浏览了Stack Overflow 以及一些相关社区中关于该主题的许多帖子argument list too long
,但我似乎并不清楚长度限制是否适用于 shell 内置命令。
假设我想通过标准输入将一个很长的字符串传递给命令:
string="a very long list of words ..."
我可以说:
# not using double quotes around $string is deliberate
printf '%s
' $string | cmd ...
或者
cmd <<< $string
甚至将其通过管道传输至xargs
:
printf '%s
' $string | xargs cmd ...
有人可以澄清一下吗?
解决方案 1:
在 bash 中,导致错误的操作系统强制限制命令行长度argument list too long
并不适用于 shell 内建命令。
execve()
当系统调用返回错误代码时会触发此错误E2BIG
。调用内置函数时不execve()
涉及任何调用,因此不会发生此错误。
因此,您提出的两个操作都是安全的:cmd <<< "$string"
写入$string
临时文件,不需要将其作为 argv 元素传递(或环境变量,存储在同一保留空间池中);并且`printf '%s
' "$cmd"除非 shell 的配置已被修改(如),否则该操作将在 shell 内部进行,
enable -n printf以使用外部
printf`实现。
解决方案 2:
我似乎无法确定长度限制是否适用于 shell 内置命令。
可能不是,但你应该检查特定版本的源代码bash
(因为它是免费软件)。但是,显然存在一些(希望是更大的)限制(特别是因为malloc
内部完成的一些操作bash
可能会失败),但随后你会收到另一个错误消息或行为。
据我所知,参数列表太长错误是由于execve(2)失败而给出的E2BIG
,而 bash 的内置函数fork
则不会execve
(就像调用外部程序的命令那样)。
实际上,E2BIG
可能会出现几十万字节(确切的限制取决于内核和系统),但我猜内置函数可用于几十兆字节(在当今的台式机上)。但 YMMV(因为您可以使用ulimit
shell 执行一些setrlimit(2) ...)。我不建议通过 shell 内置函数处理千兆字节的数据。
顺便说一句,xargs(1)很有用,你甚至可以E2BIG
通过重新编译内核(以及在最近的内核中通过其他一些方法)来提高限制。几年前,这对我来说是一个重新编译内核的强大动机。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件