Línea de comando Bash y límite de entrada

¿Existe algún tipo de límite de caracteres impuesto en bash (u otros shells) por cuánto tiempo puede ser una entrada? Si es así, ¿cuál es el límite de caracteres?

Es decir, ¿es posible escribir un comando en bash que sea demasiado largo para que se ejecute la línea de comandos? Si no hay un límite requerido, ¿hay un límite sugerido?

El límite para la longitud de una línea de comando no lo impone el shell, sino el sistema operativo. Este límite generalmente está en el rango de cien kilobytes. POSIX denota este límite ARG_MAX y en los sistemas conformes POSIX puede consultarlo con

 $ getconf ARG_MAX # Get argument limit in bytes 

Por ejemplo, en Cygwin esto es 32000, y en los diferentes sistemas BSD y Linux que uso, está entre 131072 y 2621440.

Si necesita procesar una lista de archivos que exceden este límite, le recomendamos que consulte la utilidad xargs , que llama repetidamente a un progtwig con un subconjunto de argumentos que no excede ARG_MAX .

Para responder a su pregunta específica, sí, es posible intentar ejecutar un comando con una lista de argumentos demasiado larga. El shell error con un mensaje a lo largo de “lista de argumentos demasiado larga”.

Tenga en cuenta que la entrada a un progtwig (como lectura en stdin o cualquier otro descriptor de archivo) no está limitada (solo por los recursos disponibles del progtwig). Entonces, si su script de shell lee una cadena en una variable, usted no está restringido por ARG_MAX .

Ok, Denizens. Así que he aceptado los límites de longitud de línea de comando como el evangelio por bastante tiempo. Entonces, ¿qué hacer con las suposiciones de uno? Naturalmente, revísalos.

Tengo una máquina Fedora 22 a mi disposición (que significa: Linux con bash4). He creado un directorio con 500,000 inodes (archivos) en cada uno de 18 caracteres. La longitud de la línea de comando es de 9,500,000 caracteres. Creado de esta manera:

 seq 1 500000 | while read digit; do touch $(printf "abigfilename%06d\n" $digit); done 

Y notamos:

 $ getconf ARG_MAX 2097152 

Sin embargo, tenga en cuenta que puedo hacer esto:

 $ echo * > /dev/null 

Pero esto falla:

 $ /bin/echo * > /dev/null bash: /bin/echo: Argument list too long 

Puedo ejecutar un bucle for:

 $ for f in *; do :; done 

que es otro shell incorporado.

Lectura cuidadosa de la documentación para los estados ARG_MAX , longitud máxima de argumento para las funciones ejecutivas . Esto significa que: sin invocar a un exec , no hay ARG_MAX limitación ARG_MAX . Entonces, esto explicaría por qué los shell builtins no están restringidos por ARG_MAX .

Y, de hecho, puedo encontrar mi directorio si mi lista de argumentos tiene 109948 archivos de largo, o unos 2,089,000 caracteres (más o menos). Sin embargo, una vez que agregue un archivo de nombre de archivo de 18 caracteres más, recibo un error de la lista de Argumento demasiado largo . Por ARG_MAX tanto, ARG_MAX está funcionando como se anuncia: el ejecutivo está fallando con más de ARG_MAX caracteres en la lista de argumentos, incluyendo, debe tenerse en cuenta, los datos del entorno.

Hay un límite de búfer de algo así como 1024. La lectura simplemente se colgará en medio de pegar o ingresar. Para resolver esto, use la opción -e.

http://linuxcommand.org/lc3_man_pages/readh.html

-utilice Readline para obtener la línea en un shell interactivo

Cambie su lectura para leer -e y el molesto cuelgue de entrada de línea desaparece.