Limite de caracteres da linha de comandos do Linux

27

Estou passando uma variável para um script na linha de comando. Qual é o limite de caracteres de um comando? por exemplo:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Obrigado.

robdog
fonte
1
Eu não entendi a pergunta. Você está interessado no limite de caracteres?
krissi
Você precisa declarar sua pergunta com mais clareza, caso contrário, ela será fechada.
ThatGraemeGuy

Respostas:

27

O limite imposto pelo shell / SO geralmente é muito longo - geralmente com uma ou duzentos mil caracteres.

getconf ARG_MAXfornecerá o limite máximo de entrada para um comando. No sistema Debian, atualmente tenho um terminal aberto com isso retorna 131072, que é 128 * 1024. O limite é reduzido por suas variáveis ​​de ambiente, como se minha memória me servisse corretamente. Elas são passadas na mesma estrutura pelo shell, embora isso só decole algumas centenas de caracteres na maioria dos casos. Para encontrar uma aproximação desse valor, execute env | wc -c- isso sugere 325 caracteres no momento atual neste logon nesta máquina.

É provável que os scripts permitam esse tamanho total, mas não é improvável que outros utilitários imponham seus próprios limites intencionalmente ou por problemas de design. Também pode haver limites artificiais para a duração de um argumento individual em uma longa linha de comando e / ou quanto tempo pode ser o caminho para um arquivo.

David Spillett
fonte
2
No meu sistema, getconf ARG_MAXfornece 2097152, mas o comprimento máximo do argumento que posso passar ainda é 131071 (e não preciso deduzir o tamanho do ambiente).
Pausado até novo aviso.
1
Lembre-se disso xargse até find -execsão seus amigos ao lidar com listas de argumentos gigantes.
Coredump
@ Dennis: o valor retornado por getconfé o nível do kernel, eu acho. Talvez o bash esteja definindo um limite inferior por seu design / configuração? Além disso, meu conhecimento disso vem de algum tempo atrás, então pode ser que as coisas tenham mudado um pouco recentemente, embora não seja uma área na qual eu esperaria ver muito movimento, exceto em novas conchas experimentais.
David Spillett
Eu obter os mesmos resultados em ksh, zsh, dash, fishe Bash 3 como eu fiz no Bash 4. A mensagem de erro a partir fishpodem ser informativo: "peixe: O tamanho total das listas de argumentos e Meio Ambiente (130kb) excede o limite do sistema operacional de 2.0MB . " No entanto, set | wc -cé 306317 e env | wc -c2507, o que não explica a diferença. Não sei o que mais está sendo contado.
Pausado até novo aviso.
1

Você quer dizer qual é o maior comprimento variável? Para descobrir isso, você pode usar o "x" do perl para criar um nome de variável muito longo:

 VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR

No meu sistema, o 131071 funciona:

e a variável é impressa em 131072, é muito grande:

VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
davey
fonte
2
Na verdade, esse é um valor variável muito longo .
Pausado até novo aviso.
3
Além disso, você não precisa usar perlnem um script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Pausado até novo aviso.
@DennisWilliamson, no entanto, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullfunciona.
jarno 24/09/17
Isso printfocorre porque o shell é embutido, portanto, bashnão é necessário fazer isso exec()para gerar outro processo. ARG_MAXsó importa para o comprimento da lista de argumentos das execfunções ( exec(), execl(), execlp(), execvp(), execvpe(), etc.).
Vicente Olivert Riera 03/07