cod*_*ter 7 unix linux bash shell command-line-arguments
我浏览了Stack Overflow上的很多帖子以及关于这个argument list too long主题的一些相关社区,我似乎没有清楚地知道长度限制是否适用于shell内置函数.
假设我想通过标准输入将一个非常长的字符串传递给命令:
string="a very long list of words ..."
Run Code Online (Sandbox Code Playgroud)
我能说......么:
# not using double quotes around $string is deliberate
printf '%s\n' $string | cmd ...
Run Code Online (Sandbox Code Playgroud)
要么
cmd <<< $string
Run Code Online (Sandbox Code Playgroud)
甚至可以将它传递给xargs:
printf '%s\n' $string | xargs cmd ...
Run Code Online (Sandbox Code Playgroud)
有人可以澄清一下吗?
Cha*_*ffy 10
在bash中,操作系统强制执行的命令行长度限制导致错误argument list too long不适用于shell builtins.
当execve()系统调用返回错误代码时会触发此错误E2BIG.execve()调用内置函数时不涉及调用,因此无法进行错误.
因此,您提出的两个操作都是安全的:cmd <<< "$string"写入$string临时文件,不要求将其作为argv元素(或环境变量,存储在同一保留空间池中)传递; 并且printf '%s\n' "$cmd"发生在shell内部,除非shell的配置已被修改,如同enable -n printf使用外部printf实现一样.