假设我想通过标准输入将非常长的字符串传递给命令:
string="a very long list of words ..."
我能说......么:
# not using double quotes around $string is deliberate printf '%s\n' $string | cmd ...
要么
cmd <<< $string
甚至通过管道将其发送给xargs:
xargs
printf '%s\n' $string | xargs cmd ...
有人可以澄清一下吗?
在bash中,操作系统强制执行的导致错误的命令行长度限制argument list too long不适用于shell内置程序。
argument list too long
当execve()系统调用返回错误代码时,将触发此错误E2BIG。execve()调用内置函数时不会涉及任何调用,因此不会发生错误。
execve()
E2BIG
因此,您建议的两个操作都是安全的:cmd <<< "$string"写入$string一个临时文件,该文件不需要作为argv元素(或环境变量,存储在相同的保留空间池中)传递;并且printf'%s\n' "$cmd"发生在外壳内部,除非已将外壳的配置(与一样)进行了修改enable-nprintf以使用外部printf实现。
cmd <<< "$string"
$string
printf'%s\n' "$cmd"
enable-nprintf
printf