Onde se origina o erro bash: NOME_DO_COMANDO : Argument list too long

image_pdfimage_print

É comum vermos este erro em ls, rm, cp, rsync, quando apontamos para um diretório com muitos arquivos. O comando falha. Nada é retornado, e a mensagem de erro abaixo é apresentado:

bash: <comando>: Argument list too long

Exemplos:

drall@backup00003:~$ ls diretorio/alvo/*
bash: /bin/ls: Argument list too long

drall@backup00003:~$ cp diretorio/alvo/* /home/novo/diretorio/.
bash: /bin/cp: Argument list too long

drall@backup00003:~$ mv diretorio/alvo/* /home/novo/diretorio/.
bash: /bin/mv: Argument list too long

drall@backup00003:~$ rm diretorio/alvo/*
bash: /bin/rm: Argument list too long

drall@backup00002:/tmp$ rsync drall@backup00003:/diretorio/alvo/* /home/novo/diretorio/.
bash: /usr/bin/rsync: Argument list too long
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: remote command could not be run (code 126) at io.c(463) [receiver=2.6.8]

Mas qual a origem deste problema? Onde ele ocorre e por que afeta vários comandos? É erro dos programas ou dos comandos em si?

Na verdade esta limitação vem do Unix.

dev02@backup00003:~$ getconf ARG_MAX
131072

#Retorno acima em bytes. Valor em Kilobytes é 128 "Kbytes"


#E abaixo o código fonte do arquivo do Linux responsável por criar esta limitação
dev02@backup00003:~$ cat /usr/include/linux/binfmts.h
#ifndef _LINUX_BINFMTS_H
#define _LINUX_BINFMTS_H

#include <linux/capability.h>

struct pt_regs;

/*
 * These are the maximum length and maximum number of strings passed to the
 * execve() system call.  MAX_ARG_STRLEN is essentially random but serves to
 * prevent the kernel from being unduly impacted by misaddressed pointers.
 * MAX_ARG_STRINGS is chosen to fit in a signed 32-bit integer.
 */
#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define MAX_ARG_STRINGS 0x7FFFFFFF

/* sizeof(linux_binprm->buf) */
#define BINPRM_BUF_SIZE 128

#endif /* _LINUX_BINFMTS_H */

Da próxima vez que ver este problema, já sabe o porquê ele ocorre, quem é o culpado e como ele foi originado.

Gostou? Tire um minutinho e dê sua contribuição para Drall Dev Community no Patreon!