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)
}'