Límite de caracteres de la línea de comandos de Linux

27

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.

robdog
fuente
1
No entiendo la pregunta. ¿Te interesa el límite de personajes?
krissi
Debe formular su pregunta con mayor claridad, de lo contrario, solo se cerrará.
ThatGraemeGuy

Respuestas:

27

El límite impuesto por el shell / sistema operativo es generalmente muy largo, generalmente uno o doscientos mil caracteres.

getconf ARG_MAXle 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.

David Spillett
fuente
2
En mi sistema, getconf ARG_MAXda 2097152, pero la longitud máxima de arg que puedo pasar sigue siendo 131071 (y no tengo que deducir el tamaño del entorno).
Pausado hasta nuevo aviso.
1
También recuerda eso xargse incluso find -execson tus amigos cuando se trata de listas de argumentos gigantes.
coredump
@Dennis: el valor devuelto por getconfes 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.
David Spillett
Consigo los mismos resultados en ksh, zsh, dash, fishy Bash 3 como lo hice en Bash 4. El mensaje de error fishpuede 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 -ces 306317 y env | wc -ces 2507 que no explican la diferencia. No sé qué más se está contando.
Pausado hasta nuevo aviso.
1

¿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
davey
fuente
2
En realidad, es un valor variable muy largo .
Pausado hasta nuevo aviso.
3
Además, no tiene que usar perlni un script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
pausa hasta nuevo aviso.
@DennisWilliamson, sin embargo, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullfunciona.
jarno
Esto se debe a que printfes un shell incorporado, por lo que bashno es necesario hacer un exec()proceso para generar otro. ARG_MAXSólo importa a la longitud de la lista de argumentos de las execfunciones ( exec(), execl(), execlp(), execvp(), execvpe(), etc.).
Vicente Olivert Riera