O shc é o cara pra isso, mas tem pelo menos duas abordagens aí:
1. Escrever um parser que vai gerar código de uma linguagem compilada (C por exemplo) a partir de shell. Isso seria o terror. rs
2. Passar o conteúdo de um script para o interpretador do shell, a partir de um compilado.
Na abordagem 2, um código embrionário seria:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char buff[] = "echo 3+3|bc\n" \
"for i in {1..5}; do" \
" echo $i\n" \
"done\n" \
"pwd\n";
system(buff);
return 0;
}
Ao compilar e executar, você tem a seguinte saída:
$ gcc -o a a.c
$ ./a
6
1
2
3
4
5
/tmp
Funciona, mas tem maneiras melhores. Ao invés de usar um buffer de char, poderia ler de um arquivo (o script), ao invés de usar a system(), criar um pipe para o binário do bash com o a popen [1], etc. Ou simplesmente usar o shc. O.o
A necessidade é esconder o código do script? Ter mais performance? Qual a treta? rs
Abraço.