Der*_*den 81 unix bash shell command-line-arguments
在bash(或其他shell)中是否存在某种字符限制,可以输入多长时间?如果是这样,那个字符限制是什么?
即是否可以在bash中编写一个命令行执行时间过长的命令?如果没有要求的限制,是否有建议的限制?
Jen*_*ens 112
命令行长度的限制不是由shell强加的,而是由操作系统强加的.此限制通常在100千字节的范围内.POSIX表示此限制ARG_MAX,在POSIX符合系统上,您可以使用它进行查询
$ getconf ARG_MAX # Get argument limit in bytes
Run Code Online (Sandbox Code Playgroud)
例如在Cygwin上这是32000,在不同的BSD和Linux系统上,我使用它是从131072到2621440.
如果您需要处理超过此限制的文件列表,您可能需要查看该xargs实用程序,该实用程序使用不超过的参数子集重复调用程序ARG_MAX.
要回答您的具体问题,是的,可以尝试运行一个参数列表太长的命令.shell将出错,并且"参数列表太长".
需要注意的是输入一个程序(如读取标准输入或任何其他文件描述符)是不受限(仅受可用程序资源).因此,如果shell脚本将字符串读入变量,则不受限制ARG_MAX.
Mik*_*e S 41
好的,Denizens.所以我已经接受命令行长度限制作为福音很长一段时间了.那么,如何处理一个人的假设呢?自然地检查它们.
我有一台Fedora 22机器(意思是:Linux使用bash4).我创建了一个目录,其中包含500,000个inode(文件),每个长度为18个字符.命令行长度为9,500,000个字符.创建如此:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
Run Code Online (Sandbox Code Playgroud)
我们注意到:
$ getconf ARG_MAX
2097152
Run Code Online (Sandbox Code Playgroud)
但请注意我可以这样做:
$ echo * > /dev/null
Run Code Online (Sandbox Code Playgroud)
但这失败了:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Run Code Online (Sandbox Code Playgroud)
我可以运行for循环:
$ for f in *; do :; done
Run Code Online (Sandbox Code Playgroud)
这是另一个内置的shell.
仔细阅读状态文档,ARG_MAX执行函数的最大参数长度.这意味着:没有通话exec,没有ARG_MAX限制.所以它可以解释为什么shell内置不受限制ARG_MAX.
事实上,ls如果我的参数列表长度为109948个文件,或者大约2,089,000个字符(给予或接受),我可以使用我的目录.但是,一旦我添加了一个18个字符的文件名文件,那么我会得到一个参数列表太长的错误.所以ARG_MAX正如所宣传的那样工作:exec ARG_MAX在参数列表中失败的是多个字符 - 包括应该注意的环境数据.
| 归档时间: |
|
| 查看次数: |
87254 次 |
| 最近记录: |