[bash] Bash 명령 줄 및 입력 제한

bash (또는 다른 셸)에 입력 할 수있는 시간에 대해 어떤 종류의 문자 제한이 적용됩니까? 그렇다면 글자 수 제한은 얼마입니까?

즉, 명령 줄을 실행하기에 너무 긴 bash에서 명령을 작성할 수 있습니까? 필수 제한이없는 경우 제안 된 제한이 있습니까?



답변

명령 줄 길이에 대한 제한은 셸이 아니라 운영 체제에 의해 부과됩니다. 이 제한은 일반적으로 100KB 범위입니다. POSIX는이 제한을 나타내며 ARG_MAXPOSIX 준수 시스템에서 쿼리 할 수 ​​있습니다.

$ 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 주의 깊게 읽으십시오 . 즉 ,를 호출 하지 않으면 제한 이 없습니다 . 따라서 쉘 내장 기능이 .execARG_MAXARG_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로 변경하면 성가신 줄 입력 중단이 사라집니다.


답변