如何查找并克服 Shell 命令行长度限制
使用 mv 或 rm 命令时,我收到命令行长度错误(参数列表太长错误)。如何找出当前运行的 shell 命令行长度限制?编写 UNIX / BSD / Linux shell 实用程序时如何克服这些限制?
所有 shell 都对命令行长度有限制。UNIX / Linux / BSD 系统对命令行参数和环境变量可使用的字节数有限制。当您启动新进程或键入命令时,这些限制将适用,您将在屏幕上看到以下错误消息:
参数列表太长
如何找出当前命令行的长度限制?
输入以下命令(在 Linux / UNIX / BSD 操作系统下有效):
$ getconf ARG_MAX
示例输出:
262144
BSD 操作系统还支持以下命令:
$ sysctl kern.argmax
示例输出:
kern.argmax=262144
为了准确了解限制,请输入以下命令(感谢Jeff):
$ echo $(( $(getconf ARG_MAX) - $(env | wc -c) ))
输出:
261129
如何克服 shell 命令行长度问题?
您可以选择以下方式来解决这些限制:
- 使用 find 或 xargs 命令
- 使用 shell for/while 循环
查找命令示例以摆脱“参数列表太长”错误
$ find /nas/data/accounting/ -type f -exec ls -l {} \;
$ find /nas/data/accounting/ -type f -exec /bin/rm -f {} \;
xargs 命令示例,用于消除“参数列表太长”错误
$ echo /nas/data/accounting/* | xargs ls -l
$ echo /nas/data/accounting/* | xargs /bin/rm -f
while 循环示例,用于消除“参数列表太长”错误
ls -1 /nas/data/accounting/ | while read file; do mv /nas/data/accounting/$file /local/disk/ ; done
或者,您可以组合上述方法:
find /nas/data/accounting/ -type f | while read file do mv /nas/data/accounting/$file /local/disk/ done
时间命令——给出资源使用情况
使用时间命令找出每个命令的确切系统资源使用情况:
$ time find blah blah
$ time ls -1 blah | while read file; do #blah on $file; done
进一步阅读:
- 你的 shell 文档
- 手册页 ksh、bash、getconf、sysconf、sysctl、find 和 xargs