繁体   English   中英

Bash 命令行及输入限制

[英]Bash command line and input limit

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 内置函数。

好的,居民们。 所以我已经接受命令行长度限制作为福音很长一段时间了。 那么,如何处理一个人的假设呢? 自然地-检查它们。

我有一台 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限制。

事实上,如果我的参数列表是 109948 个文件长,或者大约 2,089,000 个字符(给予或接受),我可以ls我的目录。 但是,一旦我再添加一个 18 个字符的文件名文件,就会收到一个Argument list too long错误。 所以ARG_MAX就像宣传的ARG_MAX工作:exec 失败,参数列表中的字符超过ARG_MAX应该注意,包括环境数据。

在过去, tcsh的每个命令行有 1024 个字符的限制,如果你有一个很长的$PATH ,这会很困难。 我被迫重建一个私人版本的 tcsh,增加缓冲区大小以允许用户拥有长的$PATH设置。 那是2年前。 那是我放弃使用 tcsh 并切换到没有该限制的 zsh 的时候。 现在我只使用普通的旧 bash 因为它已经足够好了。

有一个类似 1024 的缓冲区限制。读取将简单地挂在中间粘贴或输入。 要解决此问题,请使用 -e 选项。

http://linuxcommand.org/lc3_man_pages/readh.html

-e 使用 Readline 获取交互式 shell 中的行

将您的 read 更改为 read -e 并且烦人的行输入挂起消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM