Это зависит значительно от системы и версии от числа и размера аргументов и на числе и размере имен переменной среды.
Традиционно на Unix, предел (как сообщается getconf ARG_MAX
) был более или менее на кумулятивном размере:
'\0'
)'\0'
), причем строка среды - условно что-то как var=value
.Мысль об этом 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
#! /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
Вы можете использовать SED
Чтобы отфильтровать вывод (любой команды / скрипта) и распечатать каждую другую строку и двойное пространство. Конечный выход:
Распечатать только нечетные строки:
command | sed n\;g
Печать линейных линий только пронумерованных:
command | sed g\;n
Команда может быть для ... сделано