strace pode apenas strace arquivos executáveis.
funk_a é uma função, uma construção de programação do shell, não algo que você possa executar.
A única coisa que strace poderia usar seria um novo shell que avalia o corpo dessa função como:
strace -o trace_output.txt -Ttt bash -c "$(typeset -f funk_a); funk_a"
(eu removi -c porque não faz sentido com -Ttt ).
Mas você verá todo o sistema chamado feito por bash para carregar e inicializar (e depois de limpar e sair), além da chamada de sistema write feita por essa função funk_a .
Ou você poderia dizer a strace para rastrear o pid do shell enquanto avalia a função funk_a :
strace -o trace_output.txt -Ttt -p "$$" &
funk_a
kill "$!"
Embora, no momento em que strace se anexa ao PID do shell, o shell poderia ter terminado de interpretar a função. Você poderia tentar alguma sincronização como
strace -o trace_output.txt -Ttt -p "$$" &
tail -F trace_output.txt | read # wait for some output in trace_output.txt
funk_a
kill "$!"
Mas, mesmo assim, dependendo do momento, trace_output.txt incluiria algumas das chamadas de sistema usadas interpretar tail|read ou kill poderia matar strace antes de ter tido tempo de gravar o rastreio para o echo comando para o arquivo de saída.
Uma abordagem melhor poderia ser envolver a chamada para funk_a entre duas chamadas de sistema reconhecíveis, como
strace -fo >(sed -n '1,\|open("///dev/null|d
\|open("/dev///null|q;p' > trace_output.txt
) -Ttt -p "$$" &
sleep 1 # give enough time for strace to start
exec 3< ///dev/null # start signal
funk_a
exec 3< /dev///null # end signal