如何解决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