bash(或其他shell)中是否存在某种字符限制,输入可以持续多长时间?如果是这样,这个字符限制是多少?
即是否可以在 bash 中编写一个太长而无法执行命令行的命令?如果没有要求的限制,是否有建议的限制?
bash(或其他shell)中是否存在某种字符限制,输入可以持续多长时间?如果是这样,这个字符限制是多少?
即是否可以在 bash 中编写一个太长而无法执行命令行的命令?如果没有要求的限制,是否有建议的限制?
命令行长度的限制不是由 shell 强加的,而是由操作系统强加的。此限制通常在数百 KB 范围内。POSIX 表示此限制ARG_MAX
,在符合 POSIX 的系统上,您可以使用
$ getconf ARG_MAX # Get argument limit in bytes
例如,在 Cygwin 上这是 32000,而在我使用的不同 BSD 和 Linux 系统上,它是从 131072 到 2621440 的任何地方。
如果您需要处理超出此限制的文件列表,您可能需要查看该xargs
实用程序,该实用程序重复调用程序,参数子集不超过ARG_MAX
.
要回答您的具体问题,是的,可以尝试运行参数列表过长的命令。shell 将出现错误,并显示“参数列表太长”的消息。
请注意,程序的输入(在标准输入或任何其他文件描述符上读取)不受限制(仅受可用程序资源的限制)。因此,如果您的 shell 脚本将一个字符串读入一个变量,那么您将不受ARG_MAX
. 该限制也不适用于 shell-builtins。
好的,居民。所以我已经接受命令行长度限制作为福音很长一段时间了。那么,如何处理一个人的假设?自然-检查它们。
我有一台 Fedora 22 机器可供使用(意思是:带有 bash4 的 Linux)。我创建了一个目录,其中包含 500,000 个 inode(文件),每个 18 个字符长。命令行长度为 9,500,000 个字符。如此创建:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
我们注意到:
$ getconf ARG_MAX
2097152
但是请注意,我可以这样做:
$ echo * > /dev/null
但这失败了:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
我可以运行一个 for 循环:
$ for f in *; do :; done
这是另一个内置的shell。
仔细阅读状态文档,ARG_MAX
exec 函数的最大参数长度。这意味着:没有调用exec
,就没有ARG_MAX
限制。所以它可以解释为什么 shell 内置函数不受ARG_MAX
.
事实上,ls
如果我的参数列表长 109948 个文件,或者大约 2,089,000 个字符(给予或接受),我可以创建我的目录。但是,一旦我再添加一个 18 个字符的文件名文件,就会得到一个Argument list too long错误。像宣传的那样ARG_MAX
工作也是如此:exec 失败,参数列表中的字符超过ARG_MAX
了 - 包括,应该注意的是环境数据。
有一个类似于 1024 的缓冲区限制。读取将简单地挂在粘贴或输入中间。要解决此问题,请使用 -e 选项。
http://linuxcommand.org/lc3_man_pages/readh.html
-e 使用 Readline 在交互式 shell 中获取行
将您的阅读更改为阅读 -e 并且烦人的行输入挂起消失。