Это не работает, потому что вам нужен пробел перед \;
. Попробуйте следующее:
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 '' {} \;
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...
или передавать их вместе с другой функцией или встроенной с помощью "$@"
.