一尘不染

“参数列表太长”限制是否适用于shell内置函数?

linux

假设我想通过标准输入将非常长的字符串传递给命令:

string="a very long list of words ..."

我能说......么:

# not using double quotes around $string is deliberate
printf '%s\n' $string | cmd ...

要么

cmd <<< $string

甚至通过管道将其发送给xargs

printf '%s\n' $string | xargs cmd ...

有人可以澄清一下吗?


阅读 382

收藏
2020-06-02

共1个答案

一尘不染

在bash中,操作系统强制执行的导致错误的命令行长度限制argument list too long不适用于shell内置程序。

execve()系统调用返回错误代码时,将触发此错误E2BIGexecve()调用内置函数时不会涉及任何调用,因此不会发生错误。

因此,您建议的两个操作都是安全的:cmd <<< "$string"写入$string一个临时文件,该文件不需要作为argv元素(或环境变量,存储在相同的保留空间池中)传递;并且printf'%s\n' "$cmd"发生在外壳内部,除非已将外壳的配置(与一样)进行了修改enable-nprintf以使用外部printf实现。

2020-06-02