如何查找和克服Shell命令行长度限制

时间:2020-01-09 10:37:15  来源:igfitidea点击:

使用mv或rm命令时,出现命令行长度错误(参数列表过长错误)。
如何找出当前正在运行的Shell命令行长度限制?
在编写UNIX/BSD/Linux Shell实用程序时,如何克服这些限制?
所有外壳程序都有/限制命令行长度。

UNIX/Linux/BSD系统对"命令行参数"和"环境变量"可以使用多少个字节有限制。
当您开始新过程或键入命令时,将应用这些限制,并且您会在屏幕上看到以下错误消息:

Argument list too long
参数列表过长

如何找出当前的命令行长度限制?

键入以下命令(在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用于/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命令提供资源使用情况

使用time命令找出每个命令的确切系统资源使用情况:

$ time find blah blah
$ time ls -1 blah | while read file; do #blah on $file; done