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.
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.
Respostas:
O limite imposto pelo shell / SO geralmente é muito longo - geralmente com uma ou duzentos mil caracteres.
getconf ARG_MAX
fornecerá 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.
getconf ARG_MAX
fornece 2097152, mas o comprimento máximo do argumento que posso passar ainda é 131071 (e não preciso deduzir o tamanho do ambiente).
xargs
e até find -exec
são seus amigos ao lidar com listas de argumentos gigantes.
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.
ksh
, zsh
, dash
, fish
e Bash 3 como eu fiz no Bash 4. A mensagem de erro a partir fish
podem 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 -c
2507, o que não explica a diferença. Não sei o que mais está sendo contado.
ARG_MAX realmente limita o tamanho total da linha de comando e do ambiente, mas você está enfrentando uma limitação adicional: um argumento não deve ser maior que MAX_ARG_STRLEN (que infelizmente é codificado para 131072).
Consulte /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
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
perl
nem um script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
funciona.
printf
ocorre porque o shell é embutido, portanto, bash
não é necessário fazer isso exec()
para gerar outro processo. ARG_MAX
só importa para o comprimento da lista de argumentos das exec
funções ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, etc.).