Ліміт символу командного рядка Linux


27

Я передаю змінну сценарію в командному рядку. Яка межа символів команди? наприклад:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Спасибі.


1
Я не розумію питання. Вас цікавить ліміт символів?
krissi

Вам потрібно чіткіше викласти своє питання, інакше його просто закриють.
ThatGraemeGuy

Відповіді:


27

Накладений ліміт оболонки / ОС, як правило, дуже довгий - зазвичай це одна або двісті тисяч символів.

getconf ARG_MAXдасть вам максимальний ліміт введення для команди. У системі Debian у мене зараз відкритий термінал, на цьому повертається 131072, що становить 128 * 1024. Обмеження зменшено вашими змінними середовища, як якщо б моя пам'ять слугувала мені правильно, вони передаються в одній структурі оболонкою, хоча це в більшості випадків зніме лише кілька сотень символів. Щоб знайти приблизний запуск цього значення env | wc -c- це говорить про 325 символів у поточний час для цього входу на цій машині.

Сценарії, ймовірно, дозволяють цю повну довжину, але малоймовірно, що інші утиліти накладуть свої обмеження навмисно або через проблеми дизайну. Також можуть бути штучні обмеження щодо того, яким довгим може бути окремий аргумент у довгому командному рядку та / або наскільки довгим може бути шлях до файлу.


2
У моїй системі getconf ARG_MAXдає 2097152, але максимальна довжина аргументу, яку я можу пройти, все ще становить 131071 (і мені не потрібно відраховувати розмір середовища).
Призупинено до подальшого повідомлення.

1
Також пам’ятайте, що xargsі навіть find -execваші друзі мають справу з гігантськими списками аргументів.
coredump

@Dennis: getconfЯ думаю, що значення повертається рівнем ядра. Можливо, bash встановлює нижню межу своєю конструкцією / конфігурацією? Крім того, моє знання про це походить з деякого часу тому, тому могло бути так, що нещодавно змінилися речі, хоча це не область, на яку я б очікував побачити багато руху, окрім нових експериментальних оболонок.
Девід Спіллетт

Я отримую ті ж результати ksh, zsh, dash, fishі Bash 3 , як я зробив в Bash 4. Повідомлення про помилку fishможе бути інформативним: «риба: Загальний розмір аргументу і оточення списків (130Kb) перевищує граничне значення операційної системи в 2.0MB . " Однак set | wc -cце 306317 і env | wc -c2507, що не враховує різниці. Я не знаю, що ще рахується.
Призупинено до подальшого повідомлення.


1

Ви маєте на увазі, яка найдовша змінна довжина? Щоб зрозуміти, що ви можете використовувати "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

2
Насправді це дуже довге змінне значення .
Призупинено до подальшого повідомлення.

3
Також не потрібно використовувати perlі сценарій:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Призупинено до подальшого повідомлення.

@DennisWilliamson, однак, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullпрацює.
jarno

Це тому printf, що вбудована оболонка, тому bashне потрібно робити exec()для нересту іншого процесу. ARG_MAXтільки має значення для довжини списку аргументів з execфункцій ( exec(), execl(), execlp(), execvp(), execvpe()і т.д.).
Вісенте Оліверт Ріера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.