Я передаю змінну сценарію в командному рядку. Яка межа символів команди? наприклад:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Спасибі.
Я передаю змінну сценарію в командному рядку. Яка межа символів команди? наприклад:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Спасибі.
Відповіді:
Накладений ліміт оболонки / ОС, як правило, дуже довгий - зазвичай це одна або двісті тисяч символів.
getconf ARG_MAX
дасть вам максимальний ліміт введення для команди. У системі Debian у мене зараз відкритий термінал, на цьому повертається 131072, що становить 128 * 1024. Обмеження зменшено вашими змінними середовища, як якщо б моя пам'ять слугувала мені правильно, вони передаються в одній структурі оболонкою, хоча це в більшості випадків зніме лише кілька сотень символів. Щоб знайти приблизний запуск цього значення env | wc -c
- це говорить про 325 символів у поточний час для цього входу на цій машині.
Сценарії, ймовірно, дозволяють цю повну довжину, але малоймовірно, що інші утиліти накладуть свої обмеження навмисно або через проблеми дизайну. Також можуть бути штучні обмеження щодо того, яким довгим може бути окремий аргумент у довгому командному рядку та / або наскільки довгим може бути шлях до файлу.
getconf ARG_MAX
дає 2097152, але максимальна довжина аргументу, яку я можу пройти, все ще становить 131071 (і мені не потрібно відраховувати розмір середовища).
xargs
і навіть find -exec
ваші друзі мають справу з гігантськими списками аргументів.
getconf
Я думаю, що значення повертається рівнем ядра. Можливо, bash встановлює нижню межу своєю конструкцією / конфігурацією? Крім того, моє знання про це походить з деякого часу тому, тому могло бути так, що нещодавно змінилися речі, хоча це не область, на яку я б очікував побачити багато руху, окрім нових експериментальних оболонок.
ksh
, zsh
, dash
, fish
і Bash 3 , як я зробив в Bash 4. Повідомлення про помилку fish
може бути інформативним: «риба: Загальний розмір аргументу і оточення списків (130Kb) перевищує граничне значення операційної системи в 2.0MB . " Однак set | wc -c
це 306317 і env | wc -c
2507, що не враховує різниці. Я не знаю, що ще рахується.
ARG_MAX дійсно обмежує загальний розмір командного рядка та оточення, але ви стикаєтесь з додатковим обмеженням: один аргумент не повинен бути довшим MAX_ARG_STRLEN (який, на жаль, жорстко закодований як 131072).
Дивіться /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
Ви маєте на увазі, яка найдовша змінна довжина? Щоб зрозуміти, що ви можете використовувати "x" perl, щоб створити дуже довге ім'я змінної:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
У моїй системі 131071 працює:
а змінна надрукована на 131072, вона занадто велика:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
і сценарій:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
працює.
printf
, що вбудована оболонка, тому bash
не потрібно робити exec()
для нересту іншого процесу. ARG_MAX
тільки має значення для довжини списку аргументів з exec
функцій ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
і т.д.).