如何解决Shell命令行长度限制问题
时间:2019-11-20 08:52:57 来源:igfitidea点击:
问题
所有shell都有命令行长度限制。当命令长度超出限制时,将报错:Argument list too long error。 参数列表过长错误
如何查看当前正在运行的Shell命令行长度限制?
在编写UNIX/BSD/Linux Shell实用程序时,如何解决shell命令过长的限制?
如何查看当前shell的命令行长度限制?
执行以下命令(在Linux/UNIX/BSD操作系统下可以运行):
$ getconf ARG_MAX
输出示例:
262144
BSD操作系统还支持以下命令:
$ sysctl kern.argmax
输出示例:
kern.argmax=262144
要获得有关限制的准确数据,请输入以下命令:
$ echo $(( $(getconf ARG_MAX) - $(env | wc -c) ))
输出示例:
261129
如何解决shell命令行长度限制问题?
您可以使用以下方法来解决这些限制:
- 使用find或xargs命令
- 使用shell的 for/while循环
使用find解决命令中参数列表过长的错误
$ 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命令查看资源使用情况
使用time命令找出每个命令的确切系统资源使用情况:
$ time find blah blah $ time ls -1 blah | while read file; do #blah on $file; done