programing

Bash 명령줄 및 입력 제한

minimums 2023. 5. 18. 20:52
반응형

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

반응형