Проблема здесь:
'-15 minutes "$n"'
Одиночные кавычки останавливают подстановку переменных, поэтому вы буквально передаете «$ n»
, а не содержимое переменной.
Напишите:
/opt/bin/date --date "-15 minutes $n" '+%Y-%m-%dT%H:%I:%S'
вместо этого.
Есть два способа решить эту проблему: вы можете указать xargs запускать команду только с одним аргументом за раз, используя -n1
или цикл для всех аргументов внутри вашей функции fun
:
function fun() { echo $1 }
export -f fun
find tests -type f -print0 | xargs -n1 -0 bash -c 'fun "$@"' --
или
function fun() { while [ -n "$1" ]; do echo $1; shift; done }
export -f fun
find tests -type f -print0 | xargs -0 bash -c 'fun "$@"' --
Используйте сценарий оболочки.
Процитирую этот отличный ответ :
Нужно ли, чтобы другие программы, помимо вашей оболочки, могли его использовать? Если да, то это должен быть сценарий.
Как уже отмечалось в других ответах, может быть возможно обойти это путем экспорта функции, но, безусловно, много проще просто использовать скрипт.
#!/bin/bash
# I'm a script named "fun"! :)
printf '%s\n' "$@"
Затем вы просто помещаете сценарий fun
где-нибудь в вашем PATH (возможно, в ~ / bin
), убедитесь, что он исполняемый, и вы можете запустить:
find tests -type f -exec fun {} +
Если вы используете GNU Parallel, это будет выглядеть так:
function fun() {
echo "$@"
}
export -f fun
find tests -type f -print0 | parallel -0 -Xj1 fun