Применяется ли общесистемный лимит на количество аргументов в функциях оболочки?

Это не работает, потому что вам нужен пробел перед \; . Попробуйте следующее:

find ${listener}/tracefiles/${listener}.log -exec cp /dev/null '{}' \;

Однако это излишне сложный способ усечения файла. Прежде всего, поскольку вы, по-видимому, знаете точный путь к файлу, все, что вам нужно сделать, это:

> ${listener}/tracefiles/${listener}.log

Если вы используете find , чтобы избежать создания файла, если он не существует, вы можно попробовать:

[ -e ${listener}/tracefiles/${listener}.log ] && > ${listener}/tracefiles/${listener}.log

Если вам действительно нужен find (если у вас есть более одного файла для работы), вы можете использовать

find ${listener}/tracefiles/${listener}.log -exec sh -c '> {}' \;

или даже:

find ${listener}/tracefiles/${listener}.log -exec printf '' {} \;
2
12.11.2018, 01:03
1 ответ

Does the system-wide limit on argument count apply in shell functions?

Нет, это ограничение системного вызова execve(), используемого процессами для запуска другого исполняемого файла для замены текущего. Это не относится к функциям, которые интерпретируются текущим интерпретатором оболочки в том же процессе. Это также не относится к встроенным -утилитам.

execve()стирает память процесса перед загрузкой и запуском нового исполняемого файла. Весь смысл функций и встроенных функций в том, чтобы этого не происходило, чтобы функция могла изменять переменные и другие параметры оболочки, поэтому они обычно не используют execve().

Do they mimic system limits

or are they independent?

Да.

What are they?

Насколько позволяют ограничения ресурсов для текущего процесса оболочки.

В руководстве bash говорится:

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

Похоже, это применимо, поскольку аргументы функции представляют собой внутренний массив оболочки (, который не передается execфункции ядра ).

Исторически ksh88и pdkshимели нижний предел для индексов массива, но не для числа аргументов функции. Вы могли получить доступ только к $1,... $9непосредственно в оболочке Bourne, но вы все равно могли передавать столько аргументов, сколько хотите, функциям и, например, перебирать их все с помощью for arg do...или передавать их вместе с другой функцией или встроенной с помощью "$@".

3
27.01.2020, 22:02

Теги

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