Para responder parte do que foi perguntado:
Primeiro, usei 'myDemoScript' em vez de 'gcc' porque fica confuso quando você chama o compilador gnu c (GCC) de um script com o mesmo nome.
1) Primeiro uma maneira básica de fazer isso sem verificar o nome do arquivo:
vim myDemoScript
i (insert mode on)
#!/usr/bin/env bash
gcc -o hello hello.m etc etc etc
ESC :wq
chmod +x myDemoScript
(torne o script executável).
Depois você pode usar apenas ./myscript.
2) Se você usar bash (ou shells similares), você pode usar $ 0, $ 1.
$ 0 irá conter o nome do programa (por exemplo, no meu caso "myDemoScript".)
$ 1 irá conter o primeiro argumento.
Então, se você chamar "./myDemoScript hello", então, dentro do script, $ 1 conterá "hello"
#$/usr/bin/env bash
echo started the script $0 with $# arguments
echo going to work on the file $1
echo compiling $1.c to produce the output file $1
gcc -o $1 $1.c
(Para mais detalhes google sobre "bash getopts")
3) Para responder como eu faria:
Para trabalhos de compilação: use make .
Make é um exagero para compilar um único arquivo c para um executável, mas é uma boa ferramenta para aprender e você pode usá-lo para muito mais. Também é muito útil se você tiver um projeto com vários arquivos. Especialmente no caso de muitos arquivos ou arquivos que levam muito tempo para compilar.
vim Makefile
i (insert mode on)
hello:
<TAB> gcc -o hello hello.m -I 'gnustep-config \
--variable=GNUSTEP_SYSTEM_HEADERS' \
-L 'gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES' \
-lgnustep-base -fconstant-string-class=NSConstantString \
-D_NATIVE_OBJC_EXCEPTIONS
debug_hello:
<TAB> gcc -g -o hello hello.m -I 'gnustep-config \
--variable=GNUSTEP_SYSTEM_HEADERS' \
-L 'gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES' \
-lgnustep-base -fconstant-string-class=NSConstantString \
-D_NATIVE_OBJC_EXCEPTIONS
clean:
<TAB> rm hello
ESC :wq (write and quit)
Com este arquivo na mesma pasta, você pode apenas emitir 'make hello'.
Make irá procurar pelo hello no Makefile .
Ele irá verificar se ele precisa construir quaisquer dependências primeiro (nenhuma é usada ou exemplo), e então executar seu comando de compilação.
Eu adicionei o rótulo * debug_hello * para demonstrar outras opções: por exemplo construindo uma versão de depuração do mesmo programa adicionando o -g
flag ao gcc.
O clean é outro bom exemplo. Parcialmente porque mostra a funcionalidade não-GCC. Parcialmente porque é muito bom ter uma maneira de limpar as coisas quando o projeto cresce para incluir dezenas de arquivos.
Make pode fazer muito mais do que o que eu acabei de mostrar, mas isso está ficando fora do tópico. Eu recomendo alguns googling se você está curioso.