É 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.