Я пытаюсь использовать xargs для параллельного вызова более сложной функции.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
Это возвращает ошибку
xargs: echo_var: No such file or directory
Любые идеи о том, как я могу использовать xargs для достижения этой цели, или любые другие решения будут приветствоваться.
Ответы:
Экспорт функции должен сделать это (не проверено):
Вы можете использовать встроенный
printf
вместо внешнегоseq
:Кроме того, использование
return 0
и томуexit 0
подобное маскирует любое значение ошибки, которое может быть создано командой, предшествующей ему. Кроме того, если нет ошибки, это по умолчанию и, следовательно, несколько избыточно.@phobic упоминает, что команда Bash может быть упрощена до
двигая
{}
прямо внутри него. Но это уязвимо для внедрения команд, как указано @Sasha.Вот пример, почему вы не должны использовать встроенный формат:
Еще один пример, почему нет :
Вот что выводится в безопасном формате :
Это сравнимо с использованием параметризованных запросов SQL, чтобы избежать внедрения .
Я использую
date
в подстановке команд или в кавычках здесь вместоrm
команды, использованной в комментарии Саши, так как это не разрушительно.источник
echo_var
, которое является функцией в этом сценарии, а не процессом (программой) в вашем PATH. То, что делает решение Денниса, это экспортирует функцию для использования дочерними процессами bash, затем переходит в подпроцесс и выполняет там._
и\
без них это не сработало для меня_
) обеспечивает заполнитель дляargv[0]
($0
), и там можно использовать практически все, что угодно. Я думаю, что я добавил backslash-точку с запятой (\;
) из-за его использования в конце-exec
предложенияfind
, но он работает без меня здесь. Фактически, если бы функция использовалась$@
вместо$1
этого, она увидела бы точку с запятой в качестве параметра, поэтому ее следует опустить.bash -c 'echo_var "{}"'
. Таким образом, вам не нужно _ {} в конце.Использование GNU Parallel выглядит следующим образом:
Если вы используете версию 20170822, вам даже не понадобится, если
export -f
вы запустите это:источник
sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' sh: parallel_bash_environment: строка 79: синтаксическая ошибка: неожиданный конец файла sh: ошибка при импорте определения функции дляparallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching
'' / usr / local / bin / bash: parallel_bash_environment: строка 79: синтаксическая ошибка: неожиданный конец file / usr / local / bin / bash: ошибка импорта определения функции для `...Нечто подобное должно работать также:
источник
Возможно, это плохая практика, но если вы определяете функции в
.bashrc
или другом скрипте, вы можете обернуть файл или, по крайней мере, определения функций с помощью параметраallexport
:источник