PowerShell, CMD, Bash, Sh – Diferenças e Conceitos de Shells e Scripts

Tempo de Leitura: 7 Minutos

Ultimamente, tenho visto muitas questões a respeito do Windows Power Shell e do antigo Command Prompt e resolvi escrever este artigo para tentar elucidar as diferenças entre eles, o porque de se manterem ambos no caso do windows e os diferentes formatos que temos nos sistemas POSIX como o MAC OS e os diversos tipos de LINUX, FreeBSD e diversos outros baseados nesse padrão. Os interpretadores de comandos ou simplesmente shell são de maneira simples, a interface pela qual um operador humano pode enviar comandos para serem executados pelo computador, exatamente da mesma maneira que se pode fazer uma determinada função pela interface gráfica (GUI) essa mesma função pode ser feita pelo shell.

Até pouco tempo atras a microsoft disponibilizava com o windows o CMD ou Command Prompt que na verdade era um interpretador de comandos simples, que tinha uma capacidade mais limitada na interpretação de scrips através do batch (.bat) que foi oriundo do sistema MS-DOS muito usado na década de 80. Claramente a MS não via nos sistemas Windows uma necessidade de uma ferramenta mais poderosa, pois quase tudo podia ser feito pela interface gráfica.

Mais recentemente, com versões do sistema específicas para servidores, baseados nos sistemas Windows NT, e com a unificação das plataformas a partir do Windows 7, recursos mais poderosos principalmente para a administração remota passaram a ser requeridos e a linguagem batch também passou a ser mais requisitada, e extendida, dando origem ao PowerShell, um interpretador mais poderoso baseado no .Net (dotNet) que possui grandes recursos principalmente para desenvolvedores e administradores de servidores.

Conceitos

Em computação, um shell (em português, concha) é uma interface de usuário para acessar os serviços de um sistema operacional. Em geral, shells dos sistemas operacionais usam uma interface de linha de comando ou uma interface gráfica de usuário, dependendo da função e operação particular de um computador. O termo mais comum e usado cotidianamente, é que se refere aos interpretadores de comandos dos sistemas Unix e seus similares, ou ao Prompt de comandos dos sistemas Windows e macOS.

Desse modo, podemos resumir que, shell é a interface que utiliza caracteres alfanuméricas digitadas em um teclado para fornecer instruções e dados para o sistema operacional, de forma interativa. Podendo ser usado para dar um comando específico ao sistema operacional, ou executar uma sequencia de comandos afim de automatizar uma determinada tarefa. O “poder” do shell como muitos costumam leiga mente dizer, se dá pela capacidade dele em executar tarefas baseados em condições, e de maneira sequencial, para isso cada sistema usa sua linguagem de automação, chamada de shell script.

Outra grande diferença entre os diversos tipos de Shell são as facilidades que eles oferecem para o reaproveitamento de comandos e manipulação da linha de comandos. Onde os mais usados são o BASH em sistemas baseados em POSIX e o COMMAND.COM em sistemas baseados em windows, e agora mais recentemente o PowerShell em sistemas baseados em Windows 8 em diante.

Funcionalidades

Todos os shell tem a capacidade de interpretar comando e executar um programa específico dentro de um sistema operacional, o que diferencia cada um é a forma que podemos reaproveitar uma saída de um comando afim de permitir que nosso script tome usa decisão, veja:

#!/bin/bash   
# A linha acima (primeira), mesmo comentada (de fato iniciada pelo shebang #!) indica qual o interpretador de comandos (shell) a ser usado para interpretar este script.
# Textos precedidos por '#" são ignorados! Útil para se fazerem comentários.
# Limpa a tela
clear
# Exibe na tela "Olá" e o nome do usuário.
echo "Olá ${USER}!"
# Verifica se o usuário tem privilégios de superusuário (é o "root"), e alerta quanto à não execução do programa em tal situação.
ROT=$(id -u)
if [ $ROT -eq 0 ]
 then
  echo "O programa não deve ser executado pelo superusuário (\"root\")."
  echo "Por favor faça autenticação como usuário comum para executá-lo."
  echo "Encerrando a sessão..."
  sleep 5
  exit 2
 else
  echo "Executando o script..."
fi
#  Código do programa...

Neste exemplo acima, nosso shell script verifica se o usuário possui poderes root para executar uma tarefa ou então, mostra uma mensagem e sai, agora imagine que ao invés dessa simples verificação o script pudesse realizar um backup diário, caso um determinado disco esteja montado ou disponível. Reiniciar o sistema caso ele esteja em um determinado nível de carga ou enfim realizar qualquer configuração ou tarefa que pudesse ser feita, inclusive tomando decisões e reaproveitando comandos e saídas de comandos para essas decisões.

Bash é o mais conhecido utilitário deste tipo usado em sistemas POSIX (Linux, BSD, incluindo MAcOS, etc). Está disponível opcionalmente no Windows 10 à partir da atualização de 2016. CMD, também conhecido como command prompt, é o utilitário do Windows. Ele é simples e funciona, mas deixa a desejar para tarefas mais sofisticadas. PowerShell é uma nova ferramenta disponível no Windows e mais recentemente no Linux e MacOS extremamente mais poderosa, flexível e extensível (através dos cmdlet – lê-se command-let). Utiliza uma linguagem de programação e infraestrutura baseada no .NET (Core nas versões mais novas). Foi desenvolvido baseado nas experiências dos diversos processadores de script para sistemas operacionais anteriormente usados, entre eles, os dois acima. Ele veio para acabar com a ideia de que tudo no Windows é melhor fazer pela GUI. Ele é bastante consistente e mais simples de usar, mesmo sendo muito mais poderoso. Ele é um pouco mais voltado para administradores com boa capacidade de programação.

As Linguagens de Script Shell

As linguagens de script podem parecer um pouco estranhas para os programadores de linguagens tradicionais, como C ou Java. A exemplo, falta de tipos para as variáveis ou mesmo o fato de estas linguagens usarem algum mecanismo obscuro para gerenciamento dinâmico de memória que consome mais recursos da máquina do que os estritamente necessários. Apesar de ser muito utilizada como mera interface de comando, o Shell é uma linguagem de programação simples e natural.

Scripts em Shell são excelentes em sistemas onde não podemos assumir a pré existência de outras linguagens, como Python ou Perl ou mesmo para scripts que rodam durante o start-up do sistemas operacional para levantar os serviços necessários e fazer as configurações dos usuários. Também são uma ótima pedida em situações simples para administradores, instaladores e como ferramenta didática para programadores iniciantes.

Algumas operações típicas executadas por linguagens de script em Shell incluem; manipulação de arquivos, execução de programas e impressão de texto. Sendo assim é muito comum ver scripts sendo utilizados para automatização de tarefas, como configurar o ambiente, executar um programa e fazer qualquer limpeza, registro, etc. Este tipo de tarefas executadas por scripts em Shells são conhecidas mais popularmente como Shell Wrappers.

Como qualquer outra linguagem de programação conhecida, um script em Shell também possui suporte a variáveis. Em uma breve explicação uma variável é um nome/objeto simbólico ao qual podemos atribuir valores, ler ou manipular o conteúdo.

Permite uso de condicionais como o IF (se), IF-ELSE (se-senão) e estruturas aninhadas onde pode-se escolher 1 entre várias opções (IF-ELSEIF-ELSE), que permitem que sequências adicionais ou condicionais sejam feitas, de acordo com valores de saidas ou estados do ambiente. Por exemplo, se um determinado software esta instalado, faça a execução dele, senão instala-o, etc.

Alguns shells permitem o uso de estruturas de repetição, como FOR (repete uma sequencia por um número finito de vazes) e WHILE (repete a sequencia enquanto as condições são verdadeiras).  E também a criação de funções do usuário.

O status de saída de um comando executado são valores, retornados pela chamada do sistema. Para os propósitos do Shell, um comando que sai com um status de saída igual a 0 (zero) significa que a execução do script foi bem-sucedida. Você pode ver os exemplos passados anteriormente onde a última linha do script o status de saída é 0 (zero). Já um status de saída diferente de zero indica falha.

Outro fator importante é que um Shell Script permite que valores sejam passados para ele, através da linha de comando, e esses valores possam mudar as ações ou modificar a execução.

Conclusão

Um interpretador Shell é a parte mais externa de um sistema operacional, ou seja, é onde os diversos usuários enviam comandos e funções para serem executados pelo computador onde eles estão sendo interpretados.

Sua principal função é automatizar tarefas executadas como operações de backup, inicialização, limpezas, criação e configurações de usuários, em conjunto com outras funções do Sistema, como a CRON, permite que essas tarefas sejam executadas em tempos determinados ou de acordo com estados e funções do sistema.

Em sistemas POSIX como o linux, é possivel que praticamente qualquer função seja feita, desde uma automação da criação de usuários, como configurações e instalações de bibliotecas e dezenas de outras funções, uma busca na web mostra scripts shell do bash, que funcionam como um simples e funcional servidor web que poderia compor um sistema embarcado para um roteador ou streamer, entre outros.

Culturalmente, sistemas UNIX possuem versões da linha de comando para todas as funções do sistema, o que não era reciproco em sistemas como o Windows, porém, com o powershell é diversas tarefas foram adicionadas, e basicamente funções podem ser adicionadas através dos cmdlets dando aos usuários o mesmo poder encontrados em sistemas unix.