当前位置: 首页 > 面试题库 >

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

锺星洲
2023-03-14
问题内容

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

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 ...

有人可以澄清一下吗?


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我想在android上现有的sqlite数据库上执行以下操作,该数据库的构建方式类似于该列:id — rule — path —someotherdata 现在,规则例如包含文件名的一部分(或者只是一些琐碎的东西,例如“ mypicture”,也可能是文件类型,例如“ jpg”)。现在我想做的是,我想编写一个查询,该查询将获取我的所有规则,其中包含输入字符串的一部分。我尝试了以下示例:

  • 在GET操作中,我们对查询参数的长度是否还有任何限制。前面我想我用的是255,这似乎增加了,但我不知道增加的限制是什么。 我面临的问题是,我尝试GETendpoint,如http://localhost:8080/data/ids=<5000 comma seaprated ids>,但失败了 但是具有500个ID(如http://localhost:8080/data/ids=<500 comm

  • 这个错误的解决方案是什么?和命令也会出现此错误吗?如果是,如何解决这些命令?

  • Gradle不构建我的android项目。 Gradle版本:1.12 Groovy:1.8.6 Ant:Apache Ant(TM)版本1.9.3编译于2013年12月23日 Ivy:2.2.0 JVM:1.7.0_51(Oracle Corporation 24.51-b03) OS:Mac OS X 10.9.3x86_64 --Stacktrace --调试

  • 问题内容: 我有一些DefaultMutableTreeNode。在程序运行时,我可以更改文本并重新验证它。但是,如果文本太长,例如文本“已测试”,则文本将显示为“ te …”。 我该如何改变呢? 谢谢 问题答案: 您必须阅读有关JTree的教程,以及如何使用TreeCellRenderer的示例 如果您确实有疑问,请更新您的问题,并在此处添加SSCCE表单中的代码

  • 问题内容: 我正在使用Redis列表,并将新项目推送到列表中。问题是我真的只需要列表中最近的10个项目。 我用来将项目添加到列表中并获取最新的10。 反正有一定数量的物品掉落吗?我将得到可能包含1,000个项目的列表,这些列表可能导致延迟带来的性能问题。 谢谢! 问题答案: 每次之后,调用将列表修剪为10个元素 参见http://redis.io/commands/ltrim