명령 줄에서 스크립트에 변수를 전달하고 있습니다. 명령의 문자 제한은 무엇입니까? 예 :
$ MyScript reallyreallyreally...reallyreallyreallylongoption
감사.
명령 줄에서 스크립트에 변수를 전달하고 있습니다. 명령의 문자 제한은 무엇입니까? 예 :
$ MyScript reallyreallyreally...reallyreallyreallylongoption
감사.
답변:
쉘 / OS 부과 제한은 일반적으로 매우 길며 일반적으로 1 ~ 2 십만 자입니다.
getconf ARG_MAX
명령에 대한 최대 입력 제한을 제공합니다. 데비안 시스템에서 현재 터미널을 열면 128107은 131072를 반환합니다. 내 메모리가 올바르게 제공되는 것처럼 환경 변수에 의해 제한이 줄어 듭니다. 이는 쉘에 의해 동일한 구조로 전달되지만 대부분의 경우 수백 자만 제거합니다. 이 값의 근사값을 찾으려면 env | wc -c
이 기계에서 현재 로그인시 325자를 제안합니다.
스크립트가이 전체 길이를 허용 할 가능성이 있지만 다른 유틸리티가 의도적으로 또는 디자인 문제를 통해 자체 제한을 적용 할 가능성은 없습니다. 긴 명령 행에서 개별 인수의 길이 및 / 또는 파일 경로의 길이에 대한 인위적인 제한이있을 수도 있습니다.
getconf ARG_MAX
2097152를 제공하지만 통과 할 수있는 최대 arg 길이는 여전히 131071입니다 (환경의 크기를 공제 할 필요는 없습니다).
xargs
, 심지어 find -exec
거대한 인자리스트를 처리 할 때 당신의 친구입니다.
getconf
은 커널 수준이라고 생각합니다. 아마도 bash는 디자인 / 구성에 의해 하한을 설정하고 있습니까? 또한, 이것에 대한 나의 지식은 얼마 전에 나왔기 때문에 최근에 조금 바뀌었을 수도 있지만 새로운 실험 껍질을 제외하고는 많은 움직임을 볼 것으로 예상되는 영역은 아닙니다.
ksh
, zsh
, dash
, fish
나는 오류 메시지에서 배쉬 4에서했던 것처럼 및 배쉬 3 fish
유익 할 수있다 : "물고기 : 인수와 환경리스트의 전체 크기 (130KB)는 2.0MB의 운영 체제 한계를 초과 " 그러나 set | wc -c
306317이고 env | wc -c
2507이며 차이를 설명하지 않습니다. 무엇을 더 세고 있는지 모르겠습니다.
ARG_MAX는 실제로 명령 행과 환경의 총 크기를 제한하지만 추가 제한이 있습니다. 한 인수는 MAX_ARG_STRLEN보다 길어서는 안됩니다 (불행히도 131072로 하드 코딩되었습니다).
https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument를 참조 하십시오.
가장 긴 가변 길이가 무엇입니까? perl의 "x"를 사용하여 매우 긴 변수 이름을 만들 수 있습니다.
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
내 시스템에서 131071이 작동합니다.
변수가 131072에 인쇄되어 너무 큽니다.
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
스크립트 를 사용할 필요가 없습니다 ./bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
은 작동합니다.
printf
쉘이 내장되어 있기 때문에 다른 프로세스를 생성 bash
하기 위해 할 필요가 없습니다 exec()
. ARG_MAX
단지의 인수 목록의 길이에 중요한 exec
(기능 exec()
, execl()
, execlp()
, execvp()
, execvpe()
, 등).