Se você souber de algum comando, digamos, ls
, digite-o e, em seguida, pressione enter, o shell saberá onde esse programa (ls) está, invocá-lo e mostrará o resultado. Este é o uso de shell "não-script".
Mas, se você encomendar alguns desses comandos em uma sequência, digamos A, B, C, D e, em seguida, colocá-lo (a sequência) em um arquivo executável, você terá um programa. O programa tem um nome e uma localização, portanto, ele pode ser referenciado e chamado; tem código, então ele pode ser executado, um comando por vez, pela CPU.
(O programa não é compilado - como, por exemplo, o código C teria sido - e isso faz dele um script. Mas é um programa, no entanto.)
Isto é, em algum aspecto, já neste momento você está programando, porque você está instruindo o computador sobre o que fazer.
Além disso, você está, novamente em um nível muito básico, também usando uma linguagem de programação, porque você não pode simplesmente digitar qualquer coisa (e esperar que funcione); ao mesmo tempo, o que quer que você digite, você receberá uma atividade do computador que corresponde exatamente ao que você escreveu.
Existem regras sobre como você deve dizer as coisas e existem regras sobre como o computador reagirá a essas coisas.
Dito isso, com "programação", você costuma associar um poder mais expressivo do que simplesmente empilhar comandos um em cima do outro. No mínimo, você gostaria de ramificar ( if ... then ... else
), iteração (loops: while
, for
, etc.) e, provavelmente, algumas outras coisas também. Mas tudo bem, já que as linguagens de script têm essas coisas e muito mais.
Os shells têm diferentes linguagens, sim, mas alguns podem se sobrepor em grande parte por causa da convenção (por que mudar uma boa maneira de dizer algo?), ou ser compatível com versões anteriores (ou algum padrão).