paulo1205
(usa Ubuntu)
Enviado em 07/07/2015 - 17:00h
Algumas observações quanto à solução dada pelo listeiro_037.
1) Eu não gosto da solução de colocar uma barra invertida (“\”) no final de cada linha, dentro de um só string, como método de embutir uma quebra de linha na string. Se alguém, por acidente, colocar um espaço depois da barra e antes da quebra de linha, esse espaço pode ficar invisível no editor de textos, mas vai impedir o programa de compilar direito. Outro problema relacionado é se o arquivo for, por exemplo, gerado no Windows e levado para compilar no Linux, pois a quebra de linha em arquivos de texto do Windows é composta por dois caracteres (CR+LF) e, no Linux, apenas por um (LF). A sequência “\”+CR+LF é uma linha de continuação no Windows, mas não no Linux, pois ele esperaria encontrar apenas “\”+LF.
Então, em vez de fazer algo como
char string_unica[]="Primeira linha.\
Segunda linha.\
Terceira linha.";
eu prefiro -- e sugiro -- fazer de um dos seguintes modos.
char string_unica[]="Primeira linha.\nSegunda linha.\nTerceira linha.";
char string_unica[]=
"Primeira linha.\n"
"Segunda linha.\n"
"Terceira linha."
;
2) A quebra de linhas entre comandos do shell é meramente estética. A rigor, ela poderia ser suprimida, e comandos consecutivos, incluindo laços de repetição e blocos de
if/
elif/.../
else/
fi, poderiam ser escritos em linha, simplesmente separados com sinais de ponto-e-vírgula, nos lugares adequados.
3) Eu acho melhor ser bem específico com relação ao shell que será usado pela função
system(). A função system executa como interpretador de comandos o
/bin/sh. No ramo de Red Hat (Fedora, CentOS e outros),
/bin/sh é um link para
/bin/bash; no Debian e derivados (Ubuntu, Mint etc.),
/bin/sh é distinto do
/bin/bash, possivelmente usando o
/bin/dash (que é menor e mais rápido, mas tem menos recursos). Em outros sistemas, pode ser que o
/bin/sh use ainda outra coisa, como o
ksh,
pdksh ou algo ainda mais criativo.
O script mostrado na listagem tem pelo menos um recurso que não é universalmente disponível: a substituição com “$(
comando)” não funciona no
/bin/sh original, que ainda é encontrável no Solaris e talvez ainda aflija alguns Linuxes mais antigos.
Então, das duas, uma: ou se adapta o script para não usar esse recurso, ou se força o uso de um interpretador específico para aquela linha de comando.
/* Força chamar o bash para interpetar os comandos. */
system("exec /bin/bash -c 'comandos ...'");
(Desnecessário dizer que aqueles apóstrofos em torno dos comandos geram seus próprios cuidados, certo?)
4) Lembrem-se que os padrões do C de 1999 e de 2011 tornaram obsoleta a definição de
main() sem se declarar o tipo de retorno. Além disso, é necessário dizer que essa função ou não recebe parâmetro nenhum (“
int main(void)”) ou recebe um contador de argumentos e uma lista de strings passadas como argumentos individuais para o programa (“
int main(int argc, char **argv)”).