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 시스템을 마음대로 사용할 수 있습니다(즉, Linux with bash4).저는 각각 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 함수에 대한 최대 인수 길이.이는 다음을 의미합니다.전화 안 함exec
,거기에는 없다ARG_MAX
한계그래서 그것은 셸 내장이 왜 제한되지 않는지 설명할 것입니다.ARG_MAX
.
그리고 정말로, 나는 할 수 있습니다.ls
내 인수 목록이 109948 파일 길이이거나 약 2,089,000자(기여 또는 가져가기)인 경우 내 디렉터리.하지만 18자 파일 이름 파일을 하나 더 추가하면 인수 목록에 너무 긴 오류가 표시됩니다.그렇게ARG_MAX
광고된 대로 작동 중: 실행이 실패하고 있습니다.ARG_MAX
인수 목록의 문자(참고해야 할 것은 환경 데이터 포함)입니다.
1024와 같은 버퍼 제한이 있습니다.읽기는 중간에 붙여넣기 또는 입력으로 행해집니다.이 문제를 해결하려면 -e 옵션을 사용합니다.
http://linuxcommand.org/lc3_man_pages/readh.html
-e Readline을 사용하여 대화형 셸에서 선을 얻습니다.
읽기를 읽기 -e로 변경하면 성가신 행 입력 중단이 사라집니다.
옛에는날.tcsh
명령줄당 1024자로 제한되어 있어 매우 길면 사용하기가 어려웠습니다.$PATH
가 긴 수 버퍼 의 개인 빌드해야 .$PATH
전입니다.그것은 20년 전의 일입니다.그때 tcsh 사용을 포기하고 그 제한이 없는 zsh로 전환했습니다.이제 나는 그저 평범하고 오래된 bash가 충분하기 때문에 그것을 사용합니다.
언급URL : https://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit
'programing' 카테고리의 다른 글
iPhone 응용 프로그램에서 메일을 보내는 방법 (0) | 2023.05.18 |
---|---|
설정이 다른 두 파일에 로깅 (0) | 2023.05.18 |
코드 파일 대 코드 이면 (0) | 2023.05.18 |
날짜 시간.yyyy-dd-MM 형식의 날짜로 구문 분석을 시도합니다. (0) | 2023.05.18 |
WPF 셸 통합 라이브러리를 사용하여 최대화할 경우 창이 화면 밖으로 이동합니다. (0) | 2023.05.18 |