Translate

Mostrar mensagens com a etiqueta Shell Script. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Shell Script. Mostrar todas as mensagens

sábado, 30 de março de 2024

JCL e USS: Eu Sabia Fazer... Até Descobrir que Precisava Aprender de Novo

 

Bellacosa Mainframe jcl e uss eu sabia fazer ate que li esse artigo

☕ Um Café no Bellacosa Mainframe

Eu Sabia Fazer... Até Descobrir que Precisava Aprender de Novo

JCL, USS e a maior lição que um Programador Mainframe pode aprender na era da Modernização

"O conhecimento verdadeiro não está em decorar comandos. Está em reconhecer padrões, independentemente da linguagem utilizada."


Existe um momento curioso na carreira de praticamente todo profissional de tecnologia.

Não importa se você programa em COBOL, Java, Python ou C.

Não importa se trabalha em Linux, Windows ou IBM z/OS.

Mais cedo ou mais tarde você olha para uma tarefa simples — algo que faz há vinte anos — e pensa:

"Espera... como é mesmo que faz isso aqui?"

A primeira reação costuma ser de frustração.

"Será que estou esquecendo?"

Na maioria das vezes, não.

Você continua sabendo exatamente o que precisa ser feito.

O problema é que o ambiente mudou.

E quando o ambiente muda, a maneira de conversar com ele também muda.

Foi exatamente isso que aconteceu quando muitos profissionais Mainframe conheceram o USS (Unix System Services).

Eles não estavam aprendendo um novo trabalho.

Estavam aprendendo uma nova língua.

E, curiosamente, isso costuma ser muito mais difícil.

Pegue uma xícara de café.

Hoje vamos conversar sobre uma das maiores armadilhas da modernização do IBM Z.


Quando o piloto entra em outro avião

Imagine um comandante com trinta anos de experiência pilotando um Boeing 737.

Um belo dia ele recebe treinamento para voar um Airbus A320.

Ele esqueceu como voar?

Claro que não.

Ele continua entendendo:

  • sustentação

  • velocidade

  • meteorologia

  • navegação

  • segurança

Tudo isso continua igual.

O que muda é:

  • onde fica cada botão;

  • como os sistemas conversam;

  • quais procedimentos devem ser executados.

Durante alguns dias ele parece um iniciante.

Mas ele não voltou ao zero.

Ele apenas precisa reconstruir seus reflexos.

É exatamente isso que acontece quando um programador experiente em JCL começa a trabalhar no USS.


O erro mais comum dos iniciantes

Quando um programador júnior aprende COBOL, tudo é novidade.

Ele aceita naturalmente ser iniciante.

Mas existe um problema curioso com profissionais experientes.

Quando entram em um ambiente parecido...

...eles esperam que tudo funcione igual.

E aí começam as comparações.

"Cadê o EXEC PGM?"

"Cadê o DD?"

"Cadê o DSN?"

"Cadê o DISP?"

"Cadê o SYSIN?"

A resposta é simples.

Eles continuam existindo...

...mas não da forma que você espera.


O IBM z/OS possui dois universos

Muitos iniciantes imaginam que existe um único ambiente Mainframe.

Na verdade existem dois mundos convivendo harmoniosamente.

Mundo tradicional

  • Batch

  • JES2/JES3

  • JCL

  • DFSORT

  • IDCAMS

  • IEBGENER

  • TSO/ISPF

  • Dataset

É o universo clássico.

É onde o Mainframe cresceu.


Mundo USS

Agora imagine colocar um Unix inteiro dentro do z/OS.

Foi exatamente isso que a IBM fez.

O USS oferece:

  • Shell

  • Bash

  • Diretórios

  • Arquivos

  • Scripts

  • Permissões POSIX

  • OpenSSH

  • Python

  • Git

  • Java

  • Node.js

  • Zowe CLI

Sem sair do z/OS.

Esse detalhe é importantíssimo.

O USS não substitui o Mainframe.

Ele amplia o Mainframe.


O maior equívoco sobre o USS

Muita gente pensa:

"Agora o Mainframe virou Linux."

Não.

Nem perto disso.

O Kernel continua sendo o z/OS.

O gerenciamento de memória continua sendo do z/OS.

O Workload Manager continua sendo do z/OS.

O RACF continua protegendo recursos.

O JES continua executando Batch.

O USS apenas fornece outra interface para conversar com o sistema operacional.

É como trocar o painel de instrumentos de um carro.

O motor continua o mesmo.


Dataset não morreu

Uma das primeiras confusões acontece aqui.

Durante décadas escrevemos:

CLIENTE.VENDAS.ARQUIVO

No USS passamos a enxergar algo como:

/u/vagner/clientes/vendas.txt

A primeira impressão é:

"Agora só existem arquivos."

Não.

Os datasets continuam existindo.

Inclusive é possível acessá-los a partir do USS.

Da mesma forma, programas Batch conseguem trabalhar com arquivos do USS.

Os dois mundos conversam.

E isso é fantástico.


DD Statements versus Pathnames

Durante anos aprendemos:

//INPUT DD DSN=CLIENTE.INPUT,DISP=SHR

O programa COBOL nunca conhecia o nome físico do dataset.

Ele apenas dizia:

SELECT CLIENTES
ASSIGN TO INPUT.

O JCL fazia a ligação.

Isso separava infraestrutura do programa.

No USS isso muda.

Agora normalmente fazemos:

programa entrada.txt saida.txt

Ou

fopen("/u/input/clientes.txt")

É outra filosofia.

Não melhor.

Não pior.

Diferente.


EXEC PGM virou comando

No Batch.

//STEP01 EXEC PGM=COBPROG

No USS.

./cobprog

Ou

cobprog

A intenção continua exatamente igual.

Executar um programa.

Mas agora o pensamento é imperativo.

Você manda executar imediatamente.

Enquanto o JCL descreve um processo inteiro.


Ordenação: o exemplo perfeito

Durante décadas utilizamos DFSORT.

//STEP EXEC PGM=SORT

Depois:

SORT FIELDS=(1,10,CH,A)

No USS tudo parece diferente.

Agora temos:

sort arquivo.txt

Ou:

syncsort

Ou pipelines:

cat clientes.txt | sort

Ou:

sort clientes.txt > clientes_ordenados.txt

Você continua ordenando.

Mas agora conversa diretamente com o sistema operacional.


Copiar arquivos

Batch.

IEBGENER.

PGM=IEBGENER

USS.

cp origem destino

Uma linha.

Fim.


Excluir arquivos

Batch.

DELETE CLIENTE.ARQ

USS.

rm arquivo

Mesma ação.

Outra gramática.


O verdadeiro desafio é psicológico

Essa talvez seja a parte mais interessante.

Quando tudo é completamente novo...

Nosso cérebro aceita aprender.

Mas quando algo parece familiar...

Tentamos usar nossos velhos reflexos.

É aí que começamos a tropeçar.

É como trocar de carro.

Você continua sabendo dirigir.

Mas procura o limpador de para-brisa no lugar errado.


O cérebro funciona por padrões

Programadores experientes não decoram comandos.

Eles criam padrões mentais.

Por exemplo.

Quando alguém fala:

"Preciso copiar dados."

Seu cérebro já responde:

IEBGENER.

Isso virou memória muscular.

Agora imagine trocar isso por:

cp

Não é difícil.

Mas o cérebro insiste em procurar o antigo caminho.


O mesmo acontece em outras tecnologias

COBOL → Java

Você continua escrevendo lógica.

Mudam:

  • sintaxe;

  • paradigma;

  • bibliotecas.


DB2 → PostgreSQL

SQL continua sendo SQL.

Mas:

  • utilitários;

  • administração;

  • backup;

  • tuning;

mudam completamente.


ISPF → VS Code

Você continua editando programas.

Mas os atalhos mudam.

A organização muda.

O fluxo muda.


JCL → Shell Script

Você continua automatizando processos.

Mas agora usa:

  • variáveis;

  • loops;

  • funções;

  • pipelines;

  • redirecionamento;

  • permissões.


Shell pensa diferente

JCL é declarativo.

Você descreve.

Quero executar isso.

Depois usar esse dataset.

Depois gravar ali.

Depois liberar espaço.

O sistema organiza tudo.

Shell é imperativo.

Você diz:

faça isso

agora isso

agora aquilo

agora copie

agora compacte

agora envie

Parece uma conversa.


A revolução silenciosa

Pouca gente percebe.

Hoje praticamente todas as ferramentas modernas do IBM Z passam pelo USS.

Git.

Python.

OpenSSH.

OpenSSL.

Java.

Node.js.

Ansible.

Docker Build Tools.

Make.

Maven.

Gradle.

VS Code.

Zowe CLI.

IBM Dependency Based Build.

Open Enterprise SDK.

Tudo isso vive ou conversa intensamente com o USS.

Quem domina USS ganha acesso ao universo moderno do Mainframe.


Curiosidade #1

O USS segue os padrões POSIX.

Isso significa que muito software originalmente criado para Unix pode ser recompilado para z/OS com poucas adaptações.

É um dos motivos pelos quais Python, Git e OpenSSH funcionam tão bem no IBM Z.


Curiosidade #2

Você pode acessar datasets tradicionais usando caminhos especiais dentro do USS.

Algo parecido com:

//CLIENTE.INPUT

Ou utilizando APIs específicas do z/OS.

É uma ponte entre os dois mundos.


Curiosidade #3

O comando ls mostra arquivos.

Mas também pode mostrar permissões POSIX.

Enquanto datasets continuam possuindo atributos completamente diferentes como:

  • RECFM

  • LRECL

  • BLKSIZE

  • DSORG

São dois modelos coexistindo.


Curiosidade #4

Muitos programas COBOL modernos conseguem trabalhar simultaneamente com:

  • datasets tradicionais;

  • arquivos USS;

  • bancos DB2;

  • APIs REST;

  • filas MQ.

Tudo no mesmo programa.

Essa integração é uma das maiores forças do IBM Z atual.


Dicas para o Programador Júnior

Não tente decorar comandos

Aprenda conceitos.

Quem entende conceitos aprende comandos rapidamente.


Entenda o objetivo

Antes de perguntar:

"Qual comando faz isso?"

Pergunte:

"O que eu quero fazer?"

A resposta quase sempre será:

  • copiar;

  • ordenar;

  • executar;

  • pesquisar;

  • transformar.

Depois descubra como cada ambiente expressa essa ideia.


Aprenda os dois mundos

Não escolha entre JCL e USS.

Aprenda ambos.

O mercado procura profissionais híbridos.


Pratique pequenos scripts

Faça scripts simples.

Copie arquivos.

Liste diretórios.

Ordene textos.

Execute programas.

Quanto mais prática, menos estranhos parecerão os comandos.


Leia JCL antigo

Muita lógica de negócio ainda vive em Batch.

Conhecer esse mundo é um enorme diferencial.


Explore o USS sem medo

Abra um shell.

Digite:

pwd
ls
cd
mkdir
cp
mv
rm
cat
grep
sort
find

São comandos simples.

Mas representam uma mudança enorme na forma de pensar.


Easter Egg do Bellacosa ☕

Existe uma frase famosa entre administradores Unix:

"Everything is a file."

No mundo Mainframe poderíamos adaptá-la para:

"Everything is a dataset... até você conhecer o USS."


Easter Egg Mainframe Nerd 🤓

Repare na sequência dos utilitários clássicos:

  • IEBGENER copia.

  • IEBCOPY copia PDS.

  • IDCAMS administra VSAM e datasets.

  • DFSORT organiza dados.

Agora observe os equivalentes Unix:

  • cp

  • mv

  • rm

  • sort

Quatro comandos substituem dezenas de utilitários especializados. Isso não significa que um modelo seja superior ao outro; significa apenas que cada ecossistema evoluiu para atender necessidades diferentes. O z/OS privilegiou controle, rastreabilidade e processamento corporativo em larga escala. O Unix priorizou simplicidade, composição de ferramentas e interatividade.


Conclusão: Aprender de Novo Não é Recomeçar

Existe uma enorme diferença entre recomeçar do zero e reconstruir seus referenciais.

Quando um desenvolvedor COBOL aprende Java, ele não esquece lógica de programação.

Quando um DBA DB2 aprende PostgreSQL, ele não esquece bancos de dados.

Quando um especialista em JCL aprende USS, ele não desaprende Batch.

Ele apenas descobre uma nova maneira de conversar com o mesmo sistema.

E talvez essa seja a maior lição da modernização do IBM Z: a tecnologia evolui, as interfaces mudam, as ferramentas se renovam, mas os princípios fundamentais permanecem. Quem entende esses princípios consegue atravessar décadas de inovação sem perder sua essência técnica.

No fim das contas, a verdadeira competência não está em decorar comandos como EXEC PGM, cp, sort ou rm. Ela está em compreender o problema, reconhecer padrões e adaptar-se rapidamente a novas formas de expressar soluções.

É por isso que os melhores profissionais de Mainframe não são aqueles que conhecem apenas o legado, nem os que dominam apenas as ferramentas modernas. São aqueles capazes de caminhar com naturalidade entre o JCL e o Bash, entre o ISPF e o VS Code, entre o dataset e o pathname, entre o Batch e o DevOps.

Porque, no IBM Z, existem dois mundos. E o profissional do futuro é aquele que fala fluentemente os dois.


sábado, 21 de julho de 2018

O Sistema de Arquivos Linux Explicado Para um Programador COBOL Padawan

 

Bellacosa Mainframe e o sistema de arquivos linux

☕ Um Café no Bellacosa Mainframe

O Sistema de Arquivos Linux Explicado Para um Programador COBOL Padawan

Muito Além do /home e do /etc: Como Pensar Como um Engenheiro DevOps, Entender a Filosofia "Everything is a File" e Descobrir as Semelhanças Entre Linux, IBM z/OS e os Grandes Data Centers do Mundo

"No Linux, cada diretório tem um propósito. No Mainframe, cada Dataset também. O profissional que entende essa filosofia deixa de decorar comandos e começa a compreender a arquitetura."


Introdução

Se existe uma característica comum entre os grandes profissionais de tecnologia, ela não é saber centenas de comandos de memória nem decorar parâmetros obscuros de configuração.

O verdadeiro diferencial é compreender como os sistemas foram projetados.

Quando um programador COBOL começa a estudar Linux, normalmente acontece algo curioso.

Ele abre um terminal, executa:

ls /

e aparece algo parecido com isto:

bin
boot
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

A primeira reação costuma ser:

"Quem inventou essa bagunça?"

Mas a resposta é exatamente o contrário.

Não existe bagunça alguma.

Existe uma organização extremamente rigorosa.

Cada diretório possui uma finalidade específica.

Cada arquivo está onde deveria estar.

Essa organização é resultado de mais de cinquenta anos de evolução dos sistemas UNIX e Linux.

Curiosamente, quem já trabalhou com IBM Mainframe possui uma enorme vantagem.

Por quê?

Porque o z/OS também foi construído sobre uma filosofia semelhante:

cada recurso possui um lugar definido, cada componente possui uma responsabilidade e a organização vale mais do que a improvisação.

É exatamente isso que iremos explorar neste café.


A filosofia antes dos comandos

Um erro muito comum entre iniciantes é querer aprender Linux decorando comandos.

ls

pwd

cd

mkdir

grep

find

chmod

systemctl

Isso é importante.

Mas não é suficiente.

Imagine entregar um martelo para alguém.

Ele pode aprender a usar o martelo.

Mas isso não significa que saiba construir uma casa.

O mesmo acontece com Linux.

Os comandos são ferramentas.

O sistema de arquivos é a arquitetura da casa.


A metáfora da casa

A imagem apresentada faz uma analogia fantástica.

Imagine que o computador é uma casa.

Existe uma porta principal.

Existem quartos.

Existe uma garagem.

Existe um depósito.

Existe uma oficina.

Existe um escritório.

Você não guarda ferramentas dentro da geladeira.

Também não coloca roupas dentro da caixa de correio.

Cada ambiente possui uma função.

Linux funciona exatamente assim.


Tudo começa no diretório raiz

/

Esse caractere é conhecido como Root Directory.

Aqui aparece uma das primeiras confusões dos iniciantes.

Muitos pensam que:

/

é o mesmo que

/root

Não é.

São coisas completamente diferentes.

O símbolo

/

representa a raiz da árvore inteira.

/root

é apenas a pasta pessoal do usuário administrador.

É exatamente como dizer que:

"O Brasil"

não é a mesma coisa que

"Brasília".

Uma coisa contém a outra.


Uma única árvore

No Windows estamos acostumados com letras.

C:

D:

E:

Cada disco possui sua própria árvore.

Linux faz diferente.

Existe apenas uma árvore.

/

Todos os discos são conectados em algum ponto dessa árvore.

Por exemplo.

Um SSD adicional pode ser montado em

/dados

Um pendrive pode aparecer em

/media

Um NAS pode ser montado em

/mnt/storage

Tudo pertence ao mesmo sistema.

Essa decisão torna a administração muito mais elegante.


O diretório /home

Na imagem, o /home representa os quartos da família.

É uma comparação perfeita.

Ali vivem os usuários.

Exemplo:

/home/joao

/home/maria

/home/vagner

Cada usuário possui seus documentos.

Downloads.

Projetos.

Fotos.

Scripts.

Repositórios Git.

VS Code.

Configurações pessoais.


Comparando com Windows

C:\Users\Joao

é praticamente equivalente a

/home/joao

Comparando com IBM Mainframe

No z/OS USS (UNIX System Services), cada usuário também possui um diretório HOME.

Exemplo:

/u/USER01

ou

/home/user01

Ou seja...

Mesmo no mundo Mainframe existe esse conceito.


O diretório /etc

Se existisse um cérebro da configuração do Linux, seria este.

/etc

A imagem chama de livro de regras.

Excelente definição.

Ali ficam praticamente todas as configurações do sistema.

Não são programas.

São parâmetros.


Arquivos famosos

passwd

/etc/passwd

Lista usuários.


shadow

/etc/shadow

Senhas criptografadas.


hosts

/etc/hosts

Tabela local de nomes.

Muito usada por desenvolvedores.


resolv.conf

Define DNS.


ssh

Configuração do servidor SSH.


systemd

Serviços do sistema.


Analogia Mainframe

Quem administra z/OS conhece o PARMLIB.

Lá ficam dezenas de parâmetros essenciais do sistema operacional.

No Linux, esse papel é desempenhado principalmente pelo /etc.


O diretório /var

VAR significa:

Variable.

São dados que mudam constantemente.

A imagem representa um depósito.

Correto.

Mas podemos aprofundar.

Ali encontramos:

logs

cache

spool

mail

bancos de dados

filas

O lugar favorito do administrador

Quando alguma aplicação falha...

Para onde todo administrador corre?

/var/log

Ali estão os registros do sistema.

Sem logs não existe investigação.

Sem investigação não existe diagnóstico.

Sem diagnóstico não existe solução.


Exemplo real

Servidor Apache.

/var/log/apache2

Servidor NGINX.

/var/log/nginx

Jenkins.

/var/log/jenkins

Docker

/var/lib/docker

PostgreSQL

/var/lib/postgresql

Analogia Mainframe

No z/OS fazemos exatamente isso.

Quando um JOB falha procuramos:

  • JESMSGLG

  • JESJCL

  • JESYSMSG

  • SYSOUT

  • SYSLOG

  • OPERLOG

  • SMF

A lógica é exatamente igual.


O diretório /tmp

A famosa área temporária.

Programas criam arquivos provisórios.

Compiladores armazenam dados temporários.

Editores também.

Arquivos antigos normalmente são removidos automaticamente.

Jamais coloque algo importante aqui.


O diretório /root

Outra confusão clássica.

Não é a raiz.

É apenas a casa do administrador.

Assim como:

/home/joao

pertence ao João,

/root

pertence ao root.


O diretório /usr

A imagem chama de oficina.

Gostei muito dessa comparação.

Ali vivem:

programas

bibliotecas

manuais

executáveis

documentação


/usr/bin

Ferramentas.

git

python

java

awk

grep

curl

find

/usr/lib

Bibliotecas.

Semelhante às DLLs do Windows.


/usr/share

Documentação.

Temas.

Ícones.

Arquivos compartilhados.


/usr/local

Programas instalados manualmente.

Muito utilizado por administradores.


Diretórios que a imagem não mostra

Agora vamos além.

/boot

Arquivos usados durante a inicialização.

Kernel.

GRUB.

Initramfs.

Sem eles o sistema não inicia.


/dev

Talvez o diretório mais genial do Linux.

Ali ficam dispositivos.

/dev/null

/dev/zero

/dev/random

/dev/sda

/dev/tty

O HD é um arquivo.

O teclado também.

A impressora também.

A porta serial também.


"Everything is a File"

Essa é uma das ideias mais elegantes da computação.

No Linux quase tudo pode ser tratado como arquivo.

Isso simplifica enormemente o sistema operacional.

Por exemplo:

cat /proc/cpuinfo

Lemos informações do processador.

cat /proc/meminfo

Informações de memória.

cat /etc/hosts

Configuração.

cat /var/log/messages

Logs.

Sempre usando a mesma ferramenta.


/proc

Não existe fisicamente.

É um pseudo sistema de arquivos.

É criado pelo kernel.

Mostra informações em tempo real.


/sys

Outra interface do kernel.

Muito usada para hardware moderno.


/media

Pendrives.

DVD.

Cartões SD.


/mnt

Montagens temporárias.

Administradores usam frequentemente.


/opt

Softwares opcionais.

Muito comum para:

IBM

Oracle

SAP

WebSphere

Ferramentas corporativas.


O Linux e o IBM z/OS têm mais em comum do que parece

Um programador COBOL acostumado com JCL pode estranhar Linux no início, mas logo percebe vários paralelos:

  • Ambos valorizam organização e padronização.

  • Ambos utilizam permissões rigorosas.

  • Ambos registram eventos em logs.

  • Ambos permitem automação por scripts (Shell Script e JCL).

  • Ambos são usados em ambientes de missão crítica.

No z/OS, você prepara um JOB, define DD Statements, controla datasets e acompanha o resultado no SDSF. No Linux, cria scripts Shell, agenda tarefas com cron ou systemd timers, redireciona entradas e saídas e consulta logs no /var/log. O objetivo é o mesmo: automatizar processos com segurança e repetibilidade.


O olhar de um profissional DevOps

DevOps não é apenas instalar Docker ou usar Git.

É compreender como o sistema funciona.

Um pipeline de CI/CD depende diretamente da estrutura do sistema operacional.

Considere um servidor Jenkins:

  • A configuração da aplicação pode estar em /etc.

  • Os binários podem estar em /usr/bin.

  • Os dados persistentes em /var/lib/jenkins.

  • Os logs em /var/log/jenkins.

  • Arquivos temporários em /tmp.

Quando algo falha, o engenheiro não "chuta". Ele segue um método, conhece a função de cada diretório e sabe onde procurar.


Lições para um COBOL Padawan

Quem programa em COBOL já aprendeu algo muito importante: organização importa.

Você separa:

  • IDENTIFICATION DIVISION

  • ENVIRONMENT DIVISION

  • DATA DIVISION

  • PROCEDURE DIVISION

Cada seção possui uma finalidade.

O Linux segue exatamente a mesma filosofia.

Misturar configurações com logs, executáveis e dados de usuários seria tão ruim quanto escrever um programa COBOL inteiro dentro da PROCEDURE DIVISION sem definir arquivos, variáveis ou estruturas.


Conclusão

A imagem da casa é uma excelente porta de entrada para compreender o sistema de arquivos Linux, mas ela é apenas o primeiro passo. Por trás dessa analogia existe uma arquitetura refinada, construída ao longo de décadas, que prioriza organização, modularidade e previsibilidade.

Para um programador COBOL Padawan, essa forma de pensar não é novidade. O mundo IBM Mainframe sempre valorizou ambientes bem estruturados, datasets organizados, bibliotecas especializadas, parâmetros centralizados e processos automatizados. Linux compartilha a mesma essência, apenas utilizando outra terminologia e outras ferramentas.

O grande ensinamento não é decorar que /etc guarda configurações ou que /var/log contém logs. O verdadeiro aprendizado é entender que cada componente do sistema tem uma responsabilidade clara. Essa disciplina reduz erros, facilita a manutenção e torna possível administrar desde um pequeno servidor até um ambiente com milhares de máquinas.

Quando você compreender a filosofia por trás da árvore de diretórios, deixará de enxergar o Linux como uma lista de comandos e passará a vê-lo como uma plataforma de engenharia. É exatamente essa mudança de mentalidade que transforma um iniciante em um profissional preparado para trabalhar com DevOps, Cloud, Containers, Kubernetes e até mesmo com a integração entre Linux e IBM Z.

Porque, no fim das contas, seja em um servidor Linux, em um cluster Kubernetes ou em um IBM z/OS que processa milhões de transações bancárias por dia, a regra continua a mesma:

Os melhores engenheiros não decoram caminhos; eles entendem a arquitetura que dá sentido a cada caminho.

 

terça-feira, 30 de janeiro de 2018

Shell Scripting - O Que Todo Programador COBOL Padawan Precisa Saber Sobre a Linguagem que Automatiza o Mundo Linux, DevOps, Cloud e Infraestrutura Moderna

 

Bellacosa Mainframe e o shell scripting

☕ Um Café no Bellacosa Mainframe

Shell Scripting

O Que Todo Programador COBOL Padawan Precisa Saber Sobre a Linguagem que Automatiza o Mundo Linux, DevOps, Cloud e Infraestrutura Moderna

"Você não está apenas aprendendo Shell Script. Está descobrindo a linguagem que faz no Linux aquilo que o JCL faz no Mainframe: coordenar, automatizar e colocar toda a infraestrutura para trabalhar em perfeita harmonia."


Introdução

Existe um momento na carreira de praticamente todo profissional de tecnologia em que ele percebe que digitar dezenas de comandos repetidamente não faz mais sentido.

Criar usuários.

Mover arquivos.

Executar backups.

Monitorar logs.

Subir aplicações.

Executar testes.

Parar servidores.

Gerar relatórios.

Se tudo isso pode ser automatizado, por que continuar fazendo manualmente?

Foi exatamente essa pergunta que ajudou a moldar um dos conceitos mais elegantes da história da computação: o Shell Script.

Hoje, praticamente toda infraestrutura Linux do planeta — desde pequenos servidores domésticos até supercomputadores, clusters Kubernetes, ambientes IBM LinuxONE, IBM Z, AWS, Azure e Google Cloud — depende diariamente de milhares de Shell Scripts.

Se você é um Programador COBOL Padawan, provavelmente já domina conceitos como JCL, Return Codes (RC), Jobs Batch, PROCs, Schedulers, datasets e automação no z/OS.

A boa notícia é que Shell Script não é um universo completamente novo.

Na verdade, diversos conceitos já fazem parte do seu dia a dia.

A diferença é que agora eles vivem no mundo Linux.

Pegue sua caneca de café.

Hoje vamos entender por que Shell Script continua sendo uma das habilidades mais valiosas da computação moderna.


A Origem do Shell

Para entender Shell Script precisamos voltar aproximadamente cinquenta anos.

Em 1969, Ken Thompson iniciou o desenvolvimento do UNIX nos laboratórios Bell Labs.

O sistema operacional precisava de uma interface simples para executar comandos.

Nascia então o primeiro Shell.

O Shell era apenas um interpretador.

Ele recebia comandos digitados pelo usuário.

Interpretava.

Chamava funções do Kernel.

Mostrava os resultados.

Naquela época ninguém imaginava que alguns anos depois aqueles comandos poderiam ser gravados em arquivos texto e executados automaticamente.

Assim surgiram os primeiros scripts.


O Shell Não é o Linux

Esse é um dos maiores equívocos dos iniciantes.

Muitos acreditam que Shell e Linux sejam a mesma coisa.

Não são.

A arquitetura simplificada funciona assim:

Usuário

↓

Shell

↓

Kernel Linux

↓

Hardware

O Kernel conversa com discos, memória, processadores e dispositivos.

O Shell conversa com o usuário.

Ele traduz comandos humanos em chamadas para o Kernel.


O Nascimento do Bourne Shell

Em 1977, Stephen Bourne desenvolveu o Bourne Shell (sh).

Foi uma revolução.

Pela primeira vez era possível escrever programas inteiros utilizando comandos do próprio sistema operacional.

A linguagem era simples.

Mas incrivelmente poderosa.

Até hoje praticamente todos os Shells modernos descendem dele.


O Surgimento do Bash

Em 1989, Brian Fox, no projeto GNU, lançou o Bash (Bourne Again Shell).

O nome é um trocadilho com "Born Again".

Ele foi desenvolvido para substituir o Bourne Shell tradicional, mantendo compatibilidade e adicionando diversos recursos modernos.

O Bash tornou-se rapidamente o padrão das distribuições GNU/Linux.

Hoje ele está presente em praticamente todas as distribuições Linux e em diversos sistemas UNIX.


Linha do Tempo dos Principais Shells

AnoShellCriador
1971Thompson ShellKen Thompson
1977Bourne Shell (sh)Stephen Bourne
1983Korn Shell (ksh)David Korn
1989BashBrian Fox (GNU)
1990Z Shell (zsh)Paul Falstad
2005Fish ShellAxel Liljencrantz

Cada um possui características específicas, mas Bash continua sendo a principal referência para automação.


Por que o Shell Existe?

Imagine administrar mil servidores.

Sem Shell Script seria necessário executar centenas de comandos manualmente em cada máquina.

Com um único script você consegue:

  • atualizar aplicações;

  • reiniciar serviços;

  • copiar arquivos;

  • verificar espaço em disco;

  • consultar APIs;

  • monitorar processos;

  • enviar alertas;

  • automatizar backups.

É exatamente por isso que o Shell é considerado uma das ferramentas fundamentais de DevOps.


A Filosofia UNIX

Existe um princípio que influenciou praticamente toda a engenharia de software moderna:

Faça uma coisa. Faça bem feita.

Em vez de criar programas gigantes, o UNIX passou a oferecer dezenas de pequenas ferramentas especializadas.

Cada comando resolve apenas um problema.

Por exemplo:

  • grep procura padrões.

  • sort ordena dados.

  • uniq elimina duplicatas.

  • cut extrai colunas.

  • sed transforma textos.

  • awk processa dados estruturados.

  • wc conta linhas, palavras e caracteres.

O verdadeiro poder surge quando essas ferramentas são combinadas por meio de pipes.


O Poder dos Pipes

O caractere | é muito mais do que um simples símbolo.

Ele conecta a saída de um comando diretamente à entrada do próximo.

Imagine uma linha de montagem industrial:

Matéria-prima
     ↓
Corte
     ↓
Pintura
     ↓
Montagem
     ↓
Embalagem

No Linux:

cat

↓

grep

↓

awk

↓

sort

↓

uniq

↓

wc

Cada comando realiza uma tarefa específica e entrega o resultado ao próximo.

Esse modelo permitiu construir sistemas extremamente eficientes décadas antes da popularização dos microsserviços.


Shell Script e o Mundo Mainframe

Esta é provavelmente a parte mais interessante para um Programador COBOL Padawan.

Observe a comparação:

MainframeLinux
JCLShell Script
PROCFunção
PARM$1, $2
Return CodeExit Status
DatasetArquivo
SchedulerCron
SYSINstdin
SYSOUTstdout
SYSPRINTstdout
CONDif
IF/THEN JCLif/then

Percebe a semelhança?

Os conceitos mudam de nome, mas a lógica permanece.

Quem domina JCL normalmente aprende Shell Script muito mais rapidamente.


Shebang

Todo script profissional começa com algo parecido com:

#!/usr/bin/env bash

Esse cabeçalho informa qual interpretador será utilizado.

Sem ele, o sistema pode tentar executar o script utilizando outro Shell, causando incompatibilidades.

É equivalente a informar explicitamente qual ambiente executará o programa.


Variáveis

No Shell praticamente tudo começa com variáveis.

NOME="Bellacosa"
IDADE=52

Elas armazenam dados temporários utilizados durante a execução.

O acesso ocorre por meio do caractere $.

echo "$NOME"

Diferentemente de linguagens como Java ou COBOL, não há necessidade de declarar tipos de dados.

Tudo inicialmente é tratado como texto.


Variáveis de Ambiente

Algumas variáveis já existem antes mesmo do script iniciar.

Entre as mais importantes estão:

  • HOME

  • PATH

  • USER

  • SHELL

  • PWD

  • HOSTNAME

  • LANG

  • TERM

Essas informações descrevem o ambiente onde o processo está sendo executado.


Variáveis Especiais

O Shell também cria automaticamente variáveis especiais:

  • $0 → nome do script.

  • $1 → primeiro argumento.

  • $2 → segundo argumento.

  • $# → quantidade de argumentos.

  • $@ → todos os argumentos preservando cada um individualmente.

  • $* → todos os argumentos como uma única expansão.

  • $$ → PID do processo atual.

  • $! → PID do último processo em background.

  • $? → código de retorno do último comando.

Essa coleção de variáveis torna os scripts altamente reutilizáveis.


Condições

Assim como em COBOL existe IF, o Shell possui:

if
then
else
fi

É possível tomar decisões baseadas em:

  • existência de arquivos;

  • valores numéricos;

  • comparação de textos;

  • permissões;

  • retorno de comandos.


Loops

O Shell oferece diferentes formas de repetição.

For

Ideal quando conhecemos previamente os elementos.

for arquivo in *.txt
do
    echo "$arquivo"
done

While

Executa enquanto uma condição permanece verdadeira.

Until

Executa até que uma condição seja satisfeita.


Funções

Scripts profissionais utilizam funções para evitar repetição.

backup() {
    echo "Executando backup..."
}

log() {
    echo "$(date) $1"
}

Isso melhora organização, manutenção e reutilização.


Operadores de Arquivos

Antes de manipular arquivos, normalmente verificamos seu estado.

Exemplos:

  • -f → arquivo regular.

  • -d → diretório.

  • -r → leitura.

  • -w → escrita.

  • -x → executável.

  • -e → existe.

  • -s → não vazio.

  • -L → link simbólico.

Esses testes evitam erros durante a execução.


Redirecionamento

Todo processo Linux trabalha com três fluxos principais:

StreamNúmero
stdin0
stdout1
stderr2

Com isso podemos controlar exatamente para onde cada informação será enviada.

Exemplos:

>

Sobrescreve um arquivo.

>>

Acrescenta conteúdo.

2>

Redireciona apenas mensagens de erro.

&

Permite combinar fluxos.


O Poder do grep

O grep talvez seja o comando mais famoso do Linux.

Seu nome vem de Global Regular Expression Print.

Ele pesquisa padrões em arquivos.

grep ERROR servidor.log

Combinado com expressões regulares torna-se uma poderosa ferramenta de análise de logs.


AWK

Apesar de parecer apenas mais um comando, AWK é uma linguagem completa.

Ela trabalha naturalmente com colunas.

Por isso é muito utilizada em:

  • arquivos CSV;

  • relatórios;

  • processamento de logs;

  • extração de métricas.

Poucas ferramentas conseguem manipular dados textuais com tanta eficiência.


sed

O Stream Editor permite modificar arquivos sem abrir um editor.

Trocar:

IBM

por

Red Hat

é uma simples linha de comando.

Por isso o sed aparece frequentemente em pipelines de automação.


xargs

Outro comando extremamente poderoso.

Ele transforma a saída de um programa em argumentos para outro.

É muito utilizado em conjunto com find.


Exit Status

No Mainframe conhecemos os Return Codes.

No Linux existe exatamente o mesmo conceito.

Após qualquer comando podemos consultar:

echo $?

Se retornar zero:

Sucesso.

Qualquer outro valor indica algum tipo de erro.

Scripts profissionais nunca ignoram Exit Status.


DevOps e Shell Script

Hoje praticamente toda ferramenta DevOps depende, em algum momento, de Shell Script.

Exemplos:

Docker.

Kubernetes.

GitHub Actions.

GitLab CI.

Jenkins.

Ansible.

Terraform.

OpenShift.

IBM Cloud.

AWS.

Azure.

Google Cloud.

Mesmo quando utilizamos ferramentas sofisticadas, nos bastidores normalmente existem Shell Scripts coordenando processos.


Shell Script no IBM Z

Muitos profissionais acreditam que Shell Script pertence apenas ao Linux.

Não é verdade.

O IBM z/OS UNIX System Services (USS) oferece um ambiente POSIX compatível com Shell.

Isso significa que é possível executar scripts Bash ou Korn Shell diretamente no IBM Z.

Essa integração permite:

  • automatizar tarefas administrativas;

  • integrar aplicações COBOL com ambientes UNIX;

  • manipular arquivos no USS;

  • chamar programas tradicionais;

  • trabalhar com OpenSSH, Git, Python e Java.

É um dos pilares da modernização do ecossistema IBM Z.


Curiosidades

  • O Bash possui milhares de comandos internos (builtins).

  • O Shell consegue chamar programas escritos em C, COBOL, Java, Python e diversas outras linguagens.

  • Grande parte dos scripts de inicialização do Linux são Shell Scripts.

  • O Shell pode controlar processos distribuídos por SSH em centenas de servidores simultaneamente.

  • Muitos instaladores de software corporativo são escritos em Shell Script.


Easter Eggs

Algumas curiosidades divertidas:

  • O nome Bash significa Bourne Again Shell, um trocadilho com o Bourne Shell.

  • O comando : é um comando válido que não faz absolutamente nada, retornando sucesso (0).

  • O comando true sempre retorna sucesso.

  • O comando false sempre retorna erro.

  • É possível criar scripts de apenas uma linha capazes de automatizar tarefas extremamente complexas.

  • Muitos administradores brincam dizendo que "um bom Shell Script substitui centenas de cliques".


Releases e Evolução

Ao longo das décadas, o Bash evoluiu significativamente:

  • suporte aprimorado a arrays;

  • expansão de parâmetros;

  • autocompletar inteligente;

  • histórico avançado;

  • melhorias em segurança;

  • compatibilidade POSIX;

  • otimizações de desempenho.

Novas versões continuam sendo lançadas e mantidas pela comunidade GNU, garantindo correções de bugs, melhorias de segurança e novos recursos.


Por que Aprender Shell Script em 2026?

Porque praticamente toda infraestrutura moderna depende dele.

Empresas utilizam Shell Script para:

  • automação de Data Centers;

  • CI/CD;

  • monitoramento;

  • backup;

  • segurança;

  • observabilidade;

  • containers;

  • Kubernetes;

  • administração Linux;

  • IBM Z USS;

  • LinuxONE;

  • Cloud Computing;

  • IA e MLOps;

  • automação de pipelines de dados.

Mesmo linguagens modernas como Python e Go frequentemente executam Shell Scripts durante processos de instalação, build ou deploy.


Compatibilidade com o Mundo Mainframe

Para quem vem do COBOL, aprender Shell Script oferece diversas vantagens:

  • compreensão rápida da lógica de automação;

  • facilidade para trabalhar com z/OS UNIX System Services;

  • integração com Git, DevOps e CI/CD;

  • modernização de aplicações IBM Z;

  • comunicação entre ambientes Linux e Mainframe.

Em projetos de transformação digital é comum encontrar pipelines que envolvem simultaneamente COBOL, JCL, Git, Jenkins, Ansible e Shell Script.


Conclusão

Shell Script é muito mais do que uma linguagem de comandos. Ele representa uma filosofia de engenharia que atravessa mais de cinco décadas de evolução da computação. Desde os primeiros laboratórios da Bell Labs até os atuais ambientes de nuvem híbrida, inteligência artificial, IBM Z, LinuxONE e plataformas de automação em escala global, o Shell continua sendo uma das ferramentas mais eficientes para transformar tarefas repetitivas em processos confiáveis e reproduzíveis.

Para um Programador COBOL Padawan, essa jornada é especialmente natural. Conceitos como controle de fluxo, códigos de retorno, automação batch, parametrização e orquestração já fazem parte da experiência adquirida no Mainframe. O Shell Script amplia esse repertório, conectando o universo IBM Z ao ecossistema Linux, DevOps, containers, APIs, pipelines de integração contínua e infraestrutura como código.

Aprender Shell Script hoje não significa apenas dominar comandos como grep, awk, sed, find ou xargs. Significa adquirir a capacidade de construir soluções reutilizáveis, integrar tecnologias distintas, administrar ambientes complexos e participar ativamente da modernização das plataformas corporativas. Assim como o COBOL continua movimentando bilhões de transações diariamente, o Shell Script permanece como uma das engrenagens invisíveis que sustentam servidores, aplicações, clusters e serviços em praticamente todos os grandes ambientes computacionais do mundo.

No fim das contas, o Shell Script ensina uma lição que vale para toda a carreira em tecnologia: automatize o repetitivo, simplifique o complexo e deixe que os computadores façam aquilo para o qual foram criados. Esse é o espírito do UNIX, do Linux, do DevOps e, acima de tudo, da engenharia de software moderna.