Estoy pasando una variable a un script en la línea de comando. ¿Cuál es el límite de caracteres de un comando? p.ej:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Gracias.
Estoy pasando una variable a un script en la línea de comando. ¿Cuál es el límite de caracteres de un comando? p.ej:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Gracias.
Respuestas:
El límite impuesto por el shell / sistema operativo es generalmente muy largo, generalmente uno o doscientos mil caracteres.
getconf ARG_MAX
le dará el límite máximo de entrada para un comando. En el sistema Debian, actualmente tengo un terminal abierto que devuelve 131072, que es 128 * 1024. Las variables de entorno reducen el límite, ya que si mi memoria me sirve correctamente, el shell las pasa en la misma estructura, aunque eso solo eliminará unos pocos cientos de caracteres en la mayoría de los casos. Para encontrar una aproximación de esta ejecución de valor env | wc -c
, esto sugiere 325 caracteres en el momento actual en este inicio de sesión en esta máquina.
Es probable que los scripts permitan esta longitud completa, pero no es improbable que otras utilidades impongan sus propios límites, ya sea intencionalmente o por problemas de diseño. También puede haber límites artificiales para la duración de un argumento individual en una línea de comando larga y / o la duración de una ruta a un archivo.
getconf ARG_MAX
da 2097152, pero la longitud máxima de arg que puedo pasar sigue siendo 131071 (y no tengo que deducir el tamaño del entorno).
xargs
e incluso find -exec
son tus amigos cuando se trata de listas de argumentos gigantes.
getconf
es el nivel de kernel, creo. ¿Quizás bash está estableciendo un límite inferior por su diseño / configuración? Además, mi conocimiento de esto proviene de hace algún tiempo, por lo que podría ser que las cosas hayan cambiado un poco recientemente, aunque no es un área en la que esperaría ver mucho movimiento, excepto en nuevas conchas experimentales.
ksh
, zsh
, dash
, fish
y Bash 3 como lo hice en Bash 4. El mensaje de error fish
puede ser informativo: "peces: El tamaño total de las listas de argumentos y medio ambiente (130kb) supera el límite del sistema operativo de 2.0MB ". Sin embargo, set | wc -c
es 306317 y env | wc -c
es 2507 que no explican la diferencia. No sé qué más se está contando.
De hecho, ARG_MAX limita el tamaño total de la línea de comando y el entorno, pero enfrenta una limitación adicional: un argumento no debe ser más largo que MAX_ARG_STRLEN (que desafortunadamente está codificado para ser 131072).
Ver /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
¿Quieres decir cuál es la longitud variable más larga? Para resolverlo, puede usar la "x" de perl para crear un nombre de variable muy largo:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
En mi sistema 131071 funciona:
y la variable está impresa en 131072 es demasiado grande:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
ni un script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
funciona.
printf
es un shell incorporado, por lo que bash
no es necesario hacer un exec()
proceso para generar otro. ARG_MAX
Sólo importa a la longitud de la lista de argumentos de las exec
funciones ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, etc.).