Используя пользовательскую функцию bash в xargs

У меня есть эта самоопределяемая функция в моем .bashrc:

function ord() {
  printf '%d' "'$1"
}

Как заставить эту функцию использовать с xargs?:

cat anyFile.txt | awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' | xargs -i ord {}
xargs: ord: No such file or directory

Ответ 1

Во-первых, ваша функция использует только 1 аргумент, поэтому использование xargs здесь займет только первый аргумент. Вам необходимо изменить функцию на следующее:

ord() {
   printf '%d' "[email protected]"
}

Чтобы заставить xargs использовать функцию из вашего bashrc, вы должны создать новую интерактивную оболочку. Что-то вроде этого может работать:

awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' anyFile.txt | xargs bash -i -c 'ord [email protected]' _

Поскольку вы уже зависите от разбиения слов, вы можете просто сохранить вывод awk в массиве.

arr=(awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' anyFile.txt)
ord "${arr[@]}"

Или вы можете использовать awk printf:

awk '{split($0,a,""); for (i=1; i<=100; i++) printf("%d",a[i])}' anyFile.txt

Ответ 2

В тривиальном случае вы можете использовать /usr/bin/printf:

xargs -I {} /usr/bin/printf '%d' "'{}"