Uma função é interna ao shell que a define. Se você executar outro programa, esse outro programa não verá a função, mesmo que também seja um shell.
(As funções são acessíveis em subshells, ou seja, quando uma cópia do shell em execução é executada para executar algo entre parênteses (…)
ou para uma substituição de comando $(…)
etc. Mas eles não são acessíveis em programas separados, por exemplo, quando execute sh -c …
.)
Defina a função no script que a usa:
#!/bin/sh
awk -F: '$4 == 0' /etc/passwd | cut -d: f1 | xargs -n1 -i bash -c '
compare() {
if [ $1 != root ]; then
echo "Fail" >> CAT1.txt
fi
}
compare "$@"' _
(Eu suponho que este é um exemplo de brinquedo, tudo isso pode ser feito em um único script awk simples.)
Como alternativa, você pode usar um recurso bash que permite que as funções sejam exportadas através do ambiente para uma instância filha do bash. Este é um recurso específico do bash, então o script pai teria que executar o bash, não sh.
#!/bin/bash
compare() {
if [ $1 != root ]; then
echo "Fail" >> CAT1.txt
fi
}
export -f compare
awk -F: '$4 == 0' /etc/passwd | cut -d: f1 | xargs -n1 -i bash -c 'compare "$@"' _