Eu tento escrever um bash que compila e executa múltiplos arquivos. A compilação funciona, mas a execução trava.
Aqui está o código:
#!/bin/bash
echo "Génération des executables"
for file in $(ls *_test.c)
do
echo "génération de ${file%.c}.exe"
#gcc -o "${file%.c}.exe" -I$1 '$file' $1/examCIN.c
gcc -o ${file%.c}.exe $file examCIN.c
done
echo; echo "**************"
echo "Execution des tests"
for file in $(ls *_test.exe)
do
echo "execution de ./$file"
$(./$file)
done
e aqui está o resultado da execução:
fafi_dev@fafi-UbuntuStudio:~/Documents/Professionnel/Cours_Fab/ISEN/Algo/2024-2025/Examens/CIN-U/machine/Sujet$ ./test.sh
Génération des executables
génération de examCIN_BSTdelete_test.exe
/usr/bin/ld : /tmp/cc4KKeHZ.o : dans la fonction « BSTdelete_test » :
examCIN_BSTdelete_test.c:(.text+0x4f4) : référence indéfinie vers « BSTdelete »
/usr/bin/ld : examCIN_BSTdelete_test.c:(.text+0x51d) : référence indéfinie vers « BSTdelete »
collect2: error: ld returned 1 exit status
génération de examCIN_BSTdequeue_test.exe
génération de examCIN_BSTenqueue_test.exe
génération de examCIN_BSTinsert_test.exe
génération de examCIN_BSTmin_test.exe
génération de examCIN_BSTprint_test.exe
génération de examCIN_BSTSearch_test.exe
génération de examCIN_initTreeNode_test.exe
**************
Execution des tests
execution de ./examCIN_BSTdequeue_test.exe
./test.sh: ligne 17: examCIN_BSTdelete_test.c : commande introuvable
execution de ./examCIN_BSTenqueue_test.exe
./test.sh: ligne 17: Vérifiez : commande introuvable
execution de ./examCIN_BSTinsert_test.exe
./test.sh: ligne 17: examCIN_BSTdelete_test.c : commande introuvable
execution de ./examCIN_BSTmin_test.exe
./test.sh: ligne 17: examCIN_BSTdelete_test.c : commande introuvable
execution de ./examCIN_BSTprint_test.exe
./test.sh: ligne 17: vérifiez : commande introuvable
execution de ./examCIN_BSTSearch_test.exe
./test.sh: ligne 17: examCIN_BSTdelete_test.c : commande introuvable
execution de ./examCIN_initTreeNode_test.exe
./test.sh: ligne 17: examCIN_BSTdelete_test.c : commande introuvable
Alguém pode me explicar por que o arquivo a ser executado é o .c
arquivo e não .exe
o echo
?
Tentar:
Você também pode considerar coisas como
make
evitar recompilar software quando o código-fonte não foi alterado.Algumas notas:
$(ls *.c)
não faz muito sentido. É o shell encontrando a lista de arquivos cujo nome termina em.c
e não começa com.
no diretório de trabalho atual e criando um argumento de cada para passar parals
.ls
, pegando essa lista de argumentos, tratando os que começam com-
como opções e o resto como lista de diretórios cujo conteúdo paral
its
t. Para aqueles arquivos que não são do tipo diretório (provavelmente a maioria aqui, pois é raro um diretório ter seu nome terminando em.c
), eles são impressos como estão, seguidos por uma nova linha. Então com$(...)
, a saída dels
é coletada pelo shell, dividida em caracteres de$IFS
, então sujeita a uma expansão glob adicional para compor a listafor
que fará um loop.$(./$file)
faz ainda menos sentido. Primeiro,./$file
deveria ter sido"./$file"
para prevenir IFS-split+glob, então, você está coletando a saída do.exe
comando, aplicando split+glob em cima e tentando executar o resultado como um comando.nullglob
opção que faz com que tais globs se expandam para nada. Uma alternativa é usarfailglob
o que causa uma falha, embora lidar com esses erros às vezes possa ser complicado.-
causem problemas, usamos./*_test.c
em vez de*_test.c
. Para executáveis, o fato de o caminho conter uma barra significa que$PATH
a consulta não é realizada quando invocada como"$exe"
.$(...)
mencionado acima também se aplica a expansões de parâmetros sem aspas encontradas no contexto de lista no bash, por isso é importante citar todas as expansões de parâmetros.echo
geralmente não pode ser usado para gerar dados arbitrários como estão, pois dependendo do shell e/ou das configurações de tempo de compilação e/ou execução, ele não funcionará corretamente para algumas strings que começam com-
ou que contêm barras invertidas.printf>&2
(nãoecho
conforme acima) nainfo
função auxiliar..exe
erro de compilação ou execução, mas você pode querer adaptar a estratégia de tratamento de erros à sua necessidade real.