Essa provavelmente não é a melhor maneira de abordar o problema.
A partir de awk , tudo o que você pode fazer é criar uma linha de comando que system() passe para sh . Então, você precisa dos argumentos para serem formatados na sintaxe sh .
Então você precisaria:
emotion() {
echo "$i"
}
export -f emotion
awk -v q="'" '
function sh_quote(s) {
gsub(q, q "\" q q, s)
return q s q
}
{
for (i = 2; i <= NF; i++)
status = system("bash -c '\''emotion \"$@\"'\'' bash " sh_quote($1)
}'
Aqui citando o $1 de awk para que possa ser incorporado com segurança na linha de comando sh que acaba executando bash com o conteúdo de $1 como último argumento, que passa para emotion . / p>
Isso pressupõe que sh e awk não tirem as variáveis de ambiente especiais que bash usa para exportar funções (como pdksh e derivadas (como mksh ), por exemplo, ou dash desde 0.5.8, o que explica seu problema 14.04 vs 16.04 , e que sua distribuição não desativou funções exportadas em bash .
Em caso afirmativo, você pode fazer como ksh / zsh e passar a definição da função de outra forma, como:
CODE=$(typeset -f emotion) awk -v q="'" '
function sh_quote(s) {
gsub(q, q "\" q q, s)
return q s q
}
{
for (i = 2; i <= NF; i++)
status = system("bash -c '\''eval \"$CODE\"; emotion \"$@\"'\'' bash " \
sh_quote($1)
}'
Em ambos os casos, isso significa executar um sh e um bash para ele. Talvez você possa passar o $i para bash de alguma outra forma que não seja através de um system() que executa duas instâncias de um shell a cada vez. Como:
awk '{for (i=2; i<=NF; i++) printf "%sunset IFS
while read -ra fields; do
for i in "${fields[@]:1}"; do
emotion "$i"
done
done
" $i}' |
while IFS= read -r i; do
emotion "$i"
done
Ou faça a divisão da palavra em bash diretamente:
emotion() {
echo "$i"
}
export -f emotion
awk -v q="'" '
function sh_quote(s) {
gsub(q, q "\" q q, s)
return q s q
}
{
for (i = 2; i <= NF; i++)
status = system("bash -c '\''emotion \"$@\"'\'' bash " sh_quote($1)
}'