Форум русскоязычного сообщества Ubuntu


Автор Тема: Друзья, подскажите максимальную длину строки в bash  (Прочитано 7363 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Axa-Ru

  • Автор темы
  • Гость

Оффлайн ii343hbka

  • Старожил
  • *
  • Сообщений: 1048
    • Просмотр профиля
вроде ж где-то давно говорилось, что до 3х гигабайт)
ж)
ммм... Убунточка

Axa-Ru

  • Автор темы
  • Гость
Спасибо.

Оффлайн kitaets

  • Активист
  • *
  • Сообщений: 571
  • Аналитик
    • Просмотр профиля
Думаю, никто не обидится, что я поднял эту старую тему.
Решил проверить заявленное выше.
A="_"; while read i; do A="$A$A"; echo "длина строки: ${#A}"; doneОкно схлопнулось при попытке склеить две строки длиной 134217728 знаков. Свободной памяти предостаточно. Видимо, предел - 256 метров.
«Если ты не наступил на грабли, это не значит, что их нет», – kitaets.

Оффлайн ii343hbka

  • Старожил
  • *
  • Сообщений: 1048
    • Просмотр профиля
у меня с этим
длина строки: 268435456
-bash: xmalloc: ../bash/make_cmd.c:100: cannot allocate 1073741825 bytes (644738
6624 bytes allocated)
грохнулось

// debian sid x64, 4гб ram и  4gb свопа, но как-то не влезло
ж)
ммм... Убунточка

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
А у меня вот с этим полчаса молотило:

a=`dd if=/dev/zero bs=1G`
Потом, когда надоело, Ctrl-C, выдало следующее:

52+0 записей считано
51+0 записей написано
 скопировано 54760833024 байта (55 GB), 1140,48 c, 48,0 MB/c

 :o

Оффлайн kitaets

  • Активист
  • *
  • Сообщений: 571
  • Аналитик
    • Просмотр профиля
у меня с этим
длина строки: 268435456
-bash: xmalloc: ../bash/make_cmd.c:100: cannot allocate 1073741825 bytes (644738
6624 bytes allocated)
грохнулось
Ага, 134217728*2=268435456, т.е. 256 метров
Только что выяснил, что окно схлопывается в двух случаях:
- при попытке присвоить значение длиной 268435456,
- при попытке оценить размер строки более 134217728 (пробовал 134217729)
Т.е. нормально оперировать можно строками до 128 метров.

a=`dd if=/dev/zero bs=1G`Потом, когда надоело, Ctrl-C, выдало следующее:
52+0 записей считано
51+0 записей написано
 скопировано 54760833024 байта (55 GB), 1140,48 c, 48,0 MB/c
Дык на то он и есть зеро :)
Что если так?
a=`dd if=/dev/random bs=1G`
«Если ты не наступил на грабли, это не значит, что их нет», – kitaets.

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Цитировать
Что если так?
Код: [Выделить]
a=`dd if=/dev/random bs=1G`

Дык первым делом попробовал - молотит и ни каких признаков прогресса. dd причем сразу забирает себе гигабайт, а баш - чего-то пытается там осилить.

Нет, ну твой вариант у меня до схлопывания окна проработал до полгигабайта. Вообще, ИМО, зависит от большого количества факторов - от ядра, разрядности, библиотеки С и вплоть до (возможно) эмулятора терминала, в котором все это запускается.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Ubuntu 12.04

Посли таких вопросов рождается говнокод.

Как коррелирует название дистрибутива и особенности реализации конкретной оболочки командной строки?
Хотя, как коррелирует понятно. Спрошу по другому. Ты вопрос по человечески задать мог?

Axa-Ru

  • Автор темы
  • Гость
А что не так?

https://forum.ubuntu.ru/index.php?topic=49899.0
Цитировать
Первое сообщение новой темы должно содержать как минимум:

    Чёткое и внятное описание проблемы;
    Цифровое обозначение версии дистрибутива (например: Ubuntu 12.04);
    Полную версию программы (gajim 0.12.1), если речь идёт о конкретном приложении, желательно также указать версию пакета (0.12.1-0ubuntu);
    Название рабочего окружения (Unity, Gnome-Shell, XFCE);
    После каких действий возникла проблема (например: «после обновления ядра», «сразу после установки», «после обновления системы»)

Что то в вопросе не ясно?
Научи, как надо.

Оффлайн kitaets

  • Активист
  • *
  • Сообщений: 571
  • Аналитик
    • Просмотр профиля
Axa-Ru,
Вопрос всем понятен, но чёткое описание проблемы (вопроса) в первом сообщении темы действительно отсутствует.
Но вопрос актуальный. Тем более, что в руководстве по bash я ответа не нашёл. Когда-то в юности строки ограничивались длиной 255 символов (байт).
«Если ты не наступил на грабли, это не значит, что их нет», – kitaets.

Axa-Ru

  • Автор темы
  • Гость
Научи, как надо.
было задать этот вопрос.
« Последнее редактирование: 04 Июня 2013, 00:30:43 от Axa-Ru »

Оффлайн kitaets

  • Активист
  • *
  • Сообщений: 571
  • Аналитик
    • Просмотр профиля
Axa-Ru,
Да банально скопировать текст из названия темы :)
Некоторые, бывает, весь вопрос в теме излагают, а в топике - только "собсна сабж". Я каждый раз на таком зависаю. В данном случае несколько схоже.
«Если ты не наступил на грабли, это не значит, что их нет», – kitaets.

Axa-Ru

  • Автор темы
  • Гость
По существу.
$ getconf -a | grep MAX
LINK_MAX                           65000
_POSIX_LINK_MAX                    65000
MAX_CANON                          255
_POSIX_MAX_CANON                   255
MAX_INPUT                          255
_POSIX_MAX_INPUT                   255
NAME_MAX                           255
_POSIX_NAME_MAX                    255
PATH_MAX                           4096
_POSIX_PATH_MAX                    4096
SOCK_MAXBUF                       
ARG_MAX                            2097152
ATEXIT_MAX                         2147483647
CHAR_MAX                           127
CHILD_MAX                          62803
INT_MAX                            2147483647
IOV_MAX                            1024
LOGNAME_MAX                        256
MB_LEN_MAX                         16
NGROUPS_MAX                        65536
NL_ARGMAX                          4096
NL_LANGMAX                         2048
NL_MSGMAX                          2147483647
NL_NMAX                            2147483647
NL_SETMAX                          2147483647
NL_TEXTMAX                         2147483647
OPEN_MAX                           1024
PASS_MAX                           8192
PTHREAD_KEYS_MAX                   1024
PTHREAD_THREADS_MAX               
SCHAR_MAX                          127
SHRT_MAX                           32767
SSIZE_MAX                          32767
TTY_NAME_MAX                       32
TZNAME_MAX                         6
UCHAR_MAX                          255
UINT_MAX                           4294967295
UIO_MAXIOV                         1024
ULONG_MAX                          18446744073709551615
USHRT_MAX                          65535
_POSIX_ARG_MAX                     2097152
_POSIX_CHILD_MAX                   62803
_POSIX_NGROUPS_MAX                 65536
_POSIX_OPEN_MAX                    1024
_POSIX_SSIZE_MAX                   32767
_POSIX_STREAM_MAX                  16
TIMER_MAX                         
_POSIX_TZNAME_MAX                  6
_T_IOV_MAX                         
BC_BASE_MAX                        99
BC_DIM_MAX                         2048
BC_SCALE_MAX                       99
BC_STRING_MAX                      1000
CHARCLASS_NAME_MAX                 2048
COLL_WEIGHTS_MAX                   255
EQUIV_CLASS_MAX                   
EXPR_NEST_MAX                      32
LINE_MAX                           2048
POSIX2_BC_BASE_MAX                 99
POSIX2_BC_DIM_MAX                  2048
POSIX2_BC_SCALE_MAX                99
POSIX2_BC_STRING_MAX               1000
POSIX2_COLL_WEIGHTS_MAX            255
POSIX2_EXPR_NEST_MAX               32
_POSIX2_LINE_MAX                   2048
POSIX2_LINE_MAX                    2048
POSIX2_RE_DUP_MAX                  32767
RE_DUP_MAX                         32767
SYMLOOP_MAX                       
STREAM_MAX                         16
AIO_LISTIO_MAX                     
AIO_MAX                           
AIO_PRIO_DELTA_MAX                 20
DELAYTIMER_MAX                     2147483647
HOST_NAME_MAX                      64
LOGIN_NAME_MAX                     256
MQ_OPEN_MAX                       
MQ_PRIO_MAX                        32768
RTSIG_MAX                          32
SEM_NSEMS_MAX                     
SEM_VALUE_MAX                      2147483647
SIGQUEUE_MAX                       62803
POSIX_REC_MAX_XFER_SIZE           
SYMLINK_MAX                       

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Axa-Ru,
ладно, проехали. просто я не стой ноги встал.

Но ты реально хочешь странного. Нафига всё копить в буфере? bash не предназанчен для этого. скорее всего ты не правильно выбираешь язык для реализации своей задачи или это наверняка можно сделать с помощью конвейера и другой программы хоть на баше хоть на перле (он кстати тоже может быть просто однострочником в командной строке)

Короче постановка вопроса попахивает феерическим костылём. Давай найдём другое решение. Изложи суть решаемой задачи. А такие вещи как ограничения на размер строк оставим на откуп любознательным любителям покопаться в исходниках.
http://stackoverflow.com/questions/1078031/what-is-the-maximum-size-of-an-environment-variable-value

 

Страница сгенерирована за 0.08 секунд. Запросов: 25.