[bash] Bash 명령 줄 및 입력 제한
bash (또는 다른 셸)에 입력 할 수있는 시간에 대해 어떤 종류의 문자 제한이 적용됩니까? 그렇다면 글자 수 제한은 얼마입니까?
즉, 명령 줄을 실행하기에 너무 긴 bash에서 명령을 작성할 수 있습니까? 필수 제한이없는 경우 제안 된 제한이 있습니까?
답변
명령 줄 길이에 대한 제한은 셸이 아니라 운영 체제에 의해 부과됩니다. 이 제한은 일반적으로 100KB 범위입니다. POSIX는이 제한을 나타내며 ARG_MAX
POSIX 준수 시스템에서 쿼리 할 수 있습니다.
$ getconf ARG_MAX # Get argument limit in bytes
예를 들어 Cygwin에서 이것은 32000이고 다른 BSD 및 Linux 시스템에서는 131072에서 2621440까지입니다.
이 제한을 초과하는 파일 목록을 처리해야하는 경우 .을 xargs
초과하지 않는 인수 하위 집합으로 프로그램을 반복적으로 호출하는 유틸리티 를 살펴볼 수 있습니다 ARG_MAX
.
특정 질문에 대답하려면 예, 인수 목록이 너무 긴 명령을 실행할 수 있습니다. 쉘은 “인수 목록이 너무 깁니다”라는 메시지와 함께 오류를 발생시킵니다.
프로그램에 대한 입력 (stdin 또는 기타 파일 설명자에서 읽음)은 제한 되지 않습니다 (사용 가능한 프로그램 리소스에 의해서만). 따라서 쉘 스크립트가 문자열을 변수로 읽는다면 ARG_MAX
. 제한은 쉘 내장에도 적용되지 않습니다.
답변
좋아, 데니 즌. 그래서 저는 명령 줄 길이 제한을 꽤 오랫동안 복음으로 받아 들였습니다. 그렇다면 가정을 어떻게해야할까요? 당연히 확인하십시오.
제 마음대로 Fedora 22 머신을 가지고 있습니다 (의미 : bash4가있는 Linux). 각각 18 자 길이의 500,000 inode (파일)가있는 디렉토리를 만들었습니다. 명령 줄 길이는 9,500,000 자입니다. 이렇게 생성됨 :
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
그리고 우리는
$ getconf ARG_MAX
2097152
그러나 나는 이것을 할 수 있습니다.
$ echo * > /dev/null
그러나 이것은 실패합니다.
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
for 루프를 실행할 수 있습니다.
$ for f in *; do :; done
이것은 또 다른 쉘 내장입니다.
exec 함수에 대한 인수의 최대 길이 상태 에 대한 문서를ARG_MAX
주의 깊게 읽으십시오 . 즉 ,를 호출 하지 않으면 제한 이 없습니다 . 따라서 쉘 내장 기능이 .exec
ARG_MAX
ARG_MAX
그리고 실제로 ls
내 인수 목록이 109948 파일 길이이거나 약 2,089,000 문자 (주거나 가져 가기)이면 디렉토리를 사용할 수 있습니다 . 18 자 파일 이름 파일을 하나 더 추가하면 Argument list too long 오류가 발생합니다. 따라서 ARG_MAX
광고 된대로 작동합니다. exec는 ARG_MAX
인수 목록에있는 문자 (환경 데이터 포함) 이상으로 실패 합니다.
답변
1024와 같은 버퍼 제한이 있습니다. 읽기는 단순히 중간 붙여 넣기 또는 입력을 중단합니다. 이를 해결하려면 -e 옵션을 사용하십시오.
http://linuxcommand.org/lc3_man_pages/readh.html
-e Readline을 사용하여 대화 형 쉘에서 행을 얻습니다.
읽기를 -e로 변경하면 성가신 줄 입력 중단이 사라집니다.