如何查找和克服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