Как распечатать любую строку к монитору

Это зависит значительно от системы и версии от числа и размера аргументов и на числе и размере имен переменной среды.

Традиционно на Unix, предел (как сообщается getconf ARG_MAX) был более или менее на кумулятивном размере:

  • Длина строк аргумента (включая завершение '\0')
  • Длина массива указателей на те строки, так обычно 8 байтов за аргумент в системе на 64 бита
  • Длина строк среды (включая завершение '\0'), причем строка среды - условно что-то как var=value.
  • Длина массива указателей на те строки, так обычно 8 байтов за аргумент в системе на 64 бита

Мысль об этом cp также количества как аргумент (первый аргумент).

На Linux это зависит от версии. Поведение там недавно изменилось, где это не длиннее фиксированное пространство.

Проверение Linux 3.11, getconf ARG_MAX теперь сообщает о четверти предельного набора на размере стека, или 128 кибибитов, если это составляет меньше чем 512 кибибитов).

(zsh синтаксис ниже):

$ limit stacksize
stacksize       8MB
$ getconf ARG_MAX
2097152
$ limit stacksize 4M
$ getconf ARG_MAX
1048576

Тот предел находится на кумулятивном размере аргумента и строк среды и немного служебных (я подозреваю из-за соображения выравнивания на границах страницы). Размер указателей не принят во внимание.

Ища предел, я добираюсь:

$ /bin/true {1..164686}
$ /bin/true {1..164687}
zsh: argument list too long: /bin/true
$ x= /bin/true {1..164686}
$ x=1 /bin/true {1..164686}
zsh: argument list too long: /bin/true

Максимальный кумулятивный размер прежде, чем повредиться в этом случае:

$ (env _=/bin/true x=;print -l /bin/true {1..164686}) | wc -c
1044462

Теперь, это не означает, что можно передать 1 миллион пустых аргументов. В системе на 64 бита 1 миллион пустых аргументов входит в список указателя 8 МБ, которые были бы выше моего размера стека 4 МиБ.

$ IFS=:; /bin/true ${=${(l.1000000..:.)${:-}}}
zsh: killed     /bin/true ${=${(l.1000000..:.)${:-}}}

(Вы будете, заметил, что это не ошибка E2BIG. Я не уверен, в которой точке процесс уничтожается там хотя, если это в execve системный вызов или позже).

Также отметьте (все еще на Linux 3.11), что максимальный размер отдельного аргумента или строки среды составляет 128 кибибитов, независимо от размера стек.

$ /bin/true ${(l.131071..a.)${:-}} # 131072 OK
$ /bin/true ${(l.131072..a.)${:-}} # 131073 not
zsh: argument list too long: /bin/true
$ /bin/true ${(l.131071..a.)${:-}} ${(l.131071..a.)${:-}} # 2x 131072 OK
2
08.01.2015, 01:40
2 ответа
#! /bin/bash

for ((n=5, j=1; j<=9;j++)); do
    if [ $((j%2)) -eq 1 ]; then
        echo "rez: $n*$j"=$((n*j))
    else
        echo
    fi
done

rez: 5*1=5

rez: 5*3=15

rez: 5*5=25

rez: 5*7=35

rez: 5*9=45
1
27.01.2020, 22:00

Вы можете использовать SED Чтобы отфильтровать вывод (любой команды / скрипта) и распечатать каждую другую строку и двойное пространство. Конечный выход:
Распечатать только нечетные строки:

command | sed n\;g

Печать линейных линий только пронумерованных:

command | sed g\;n

Команда может быть для ... сделано

3
27.01.2020, 22:00

Теги

Похожие вопросы