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
. 제한은 쉘 내장에도 적용되지 않습니다.
cmd <<< "$LONG_VAR"
있고 LONG_VAR 값이 제한을 초과하면 명령이 날아갈까요?
LONG_VAR
stdin으로 전달되고 전적으로 쉘에서 수행 되기 때문입니다 . 에 대한 인수로 확장되지 않으므로 cmd
fork () / exec ()에 대한 ARG_MAX 제한이 작동하지 않습니다. 직접 시도해 보는 것은 쉽습니다. ARG_MAX를 초과하는 내용으로 변수를 만들고 명령을 실행하십시오.
blah="$(cat /home/schwager/Music/Recordings/20090420\ 131623.m4a)"; cat <<< $blah >/dev/null
. 오류가 없습니다.
좋아, 데니 즌. 그래서 저는 명령 줄 길이 제한을 꽤 오랫동안 복음으로 받아 들였습니다. 그렇다면 가정을 어떻게해야할까요? 당연히 확인하십시오.
제 마음대로 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
인수 목록에있는 문자 (환경 데이터 포함) 이상으로 실패 합니다.
for f in *; do echo $f; done
은 전혀 포크하지 않습니다 (모든 내장 기능). 그래서 나는 find-xargs 콤보가 더 빠를 것이라는 것을 모릅니다. 테스트되지 않았습니다. 사실, 나는 OP의 문제 세트가 무엇인지 모릅니다. 어쩌면 find /path/to/directory
이 파일의 경로 이름을 반환하기 때문에 그에게 도움이되지 않습니다. 아마도 그는 for f in *
루프 의 단순함을 좋아할 것 입니다. 그럼에도 불구하고 대화는 효율성이 아닌 라인 입력 제한에 관한 것입니다. 이제 명령 줄 길이와 관련된 주제를 계속 살펴 보겠습니다.
1024와 같은 버퍼 제한이 있습니다. 읽기는 단순히 중간 붙여 넣기 또는 입력을 중단합니다. 이를 해결하려면 -e 옵션을 사용하십시오.
http://linuxcommand.org/lc3_man_pages/readh.html
-e Readline을 사용하여 대화 형 쉘에서 행을 얻습니다.
읽기를 -e로 변경하면 성가신 줄 입력 중단이 사라집니다.
read
"명령 줄을 실행하기에 너무 긴 명령을 bash에서 작성할 수 있습니까?" 에 관한 것이 아닙니다 .
bash --noediting
, 새 프롬프트에서 명령을 실행하십시오 echo somereallylongword
. Ubuntu 18.04에서 시도한 결과 단어가 잘 리므로 Readline이 활성화되지 않은 것과 관련이 있습니다.