É em grande parte histórico, em parte uma questão de controle de um aspecto de administração do sistema, em parte uma questão de portabilidade, em parte uma questão de depuração.
"De volta ao dia", não havia autoconf, dpkg, rpm. Você baixou o software, às vezes do UUCP, compilou o produto e determinou - com suas próprias convenções - onde instalar o produto. Conectar o produto ao sistema de boot / shutdown era considerado um dever do administrador do sistema. O administrador do sistema gravaria o script rc
e o colocaria no local apropriado para esse sistema ( /etc/inittab
, /etc/rcN.d/
, /etc/rc.local
, /etc/inetd.conf
). Com menos sistemas não-Linux na vanguarda, o advento de rpm
e dpkg
torna algumas dessas opções locais menos importantes.
Os administradores de sistemas também gostam de ter alguma medida de controle sobre seus sistemas, e os mais fáceis de escrever, depurar e modificar posteriormente são os scripts de shell, não os programas em C.
Como eu aludi anteriormente, diferentes sistemas operacionais UNIX tinham maneiras diferentes de inicializar. Escrever um pequeno shell script para o seu próprio sistema era muito mais fácil do que o desenvolvedor escrever para cada possível sabor do UNIX que estava chegando (novamente, isso foi antes mesmo do autoconf): SysV, Ultrix, Irix, HP-UX, SunOS, Solaris, NextStep, NonStop, etc. Na maioria das vezes, eles se encaixavam em dois ou três mecanismos, mas cada um tinha sua própria reviravolta.
Os sistemas de inicialização podem ser complicados facilmente. É bom ter um script de shell onde você pode imprimir informações de depuração, alterar o fluxo, lidar com interações que os autores do programa não previram. Se este fosse um programa compilado, seria muito mais difícil encontrar tais erros.
Os sistemas modernos têm mecanismos mais recentes, mas a maioria ainda chamará shell scripts, principalmente pelas razões acima.