Linux 명령 행 문자 제한


26

명령 줄에서 스크립트에 변수를 전달하고 있습니다. 명령의 문자 제한은 무엇입니까? 예 :

$ MyScript reallyreallyreally...reallyreallyreallylongoption

감사.


1
질문을 이해하지 못 하겠어. 글자 수 한도에 관심이 있습니까?
krissi

질문을 더 명확하게 진술해야합니다. 그렇지 않으면 문제가 해결 될 것입니다.
ThatGraemeGuy

답변:


25

쉘 / OS 부과 제한은 일반적으로 매우 길며 일반적으로 1 ~ 2 십만 자입니다.

getconf ARG_MAX명령에 대한 최대 입력 제한을 제공합니다. 데비안 시스템에서 현재 터미널을 열면 128107은 131072를 반환합니다. 내 메모리가 올바르게 제공되는 것처럼 환경 변수에 의해 제한이 줄어 듭니다. 이는 쉘에 의해 동일한 구조로 전달되지만 대부분의 경우 수백 자만 제거합니다. 이 값의 근사값을 찾으려면 env | wc -c이 기계에서 현재 로그인시 325자를 제안합니다.

스크립트가이 전체 길이를 허용 할 가능성이 있지만 다른 유틸리티가 의도적으로 또는 디자인 문제를 통해 자체 제한을 적용 할 가능성은 없습니다. 긴 명령 행에서 개별 인수의 길이 및 / 또는 파일 경로의 길이에 대한 인위적인 제한이있을 수도 있습니다.


2
내 시스템에서 getconf ARG_MAX2097152를 제공하지만 통과 할 수있는 최대 arg 길이는 여전히 131071입니다 (환경의 크기를 공제 할 필요는 없습니다).
추후 공지가있을 때까지 일시 중지되었습니다.

1
또한 그 기억 xargs, 심지어 find -exec거대한 인자리스트를 처리 할 때 당신의 친구입니다.
코어 덤프

@ 데니스 : 반환 된 값 getconf은 커널 수준이라고 생각합니다. 아마도 bash는 디자인 / 구성에 의해 하한을 설정하고 있습니까? 또한, 이것에 대한 나의 지식은 얼마 전에 나왔기 때문에 최근에 조금 바뀌었을 수도 있지만 새로운 실험 껍질을 제외하고는 많은 움직임을 볼 것으로 예상되는 영역은 아닙니다.
David Spillett

나는 동일한 결과를 얻을 수 ksh, zsh, dash, fish나는 오류 메시지에서 배쉬 4에서했던 것처럼 및 배쉬 3 fish유익 할 수있다 : "물고기 : 인수와 환경리스트의 전체 크기 (130KB)는 2.0MB의 운영 체제 한계를 초과 " 그러나 set | wc -c306317이고 env | wc -c2507이며 차이를 설명하지 않습니다. 무엇을 더 세고 있는지 모르겠습니다.
추후 공지가있을 때까지 일시 중지되었습니다.


1

가장 긴 가변 길이가 무엇입니까? 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

2
실제로 이것은 매우 긴 변수 입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

3
또한 perl스크립트 를 사용할 필요가 없습니다 ./bin/echo "$(printf "%*s" 131071 ".")">/dev/null
추후 공지가있을 때까지 일시 중지되었습니다.

그러나 @DennisWilliamson printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null은 작동합니다.
jarno

printf쉘이 내장되어 있기 때문에 다른 프로세스를 생성 bash하기 위해 할 필요가 없습니다 exec(). ARG_MAX단지의 인수 목록의 길이에 중요한 exec(기능 exec(), execl(), execlp(), execvp(), execvpe(), 등).
Vicente Olivert Riera
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.