Substituicao de Comando: Capturando Saida com $(...)

Substituicao de Comando: Capturando Saida com $(...)

O Que Voce Vai Aprender

  • O conceito de substituicao de comando
  • Como capturar a saida de um comando em uma variavel com $(command)
  • Como $(...) difere dos antigos backticks ...
  • Por que voce deve envolver com "$(...)" usando aspas

Resumo Rapido

  • Armazenar saida em uma variavelVAR=$(command)
  • Incorporar saida em texto → echo "Hoje e $(date)"
  • Na duvida, envolva com aspas duplas: "$(...)"

1. O Que e Substituicao de Comando?

Conclusao: A substituicao de comando executa um comando e substitui $(...) pela sua saida, inline.

Lina: Senpai, quando eu executo date ele imprime a data de hoje. Como eu uso esse resultado dentro de outro comando?
Veterano Linny: E exatamente para isso que a substituicao de comando serve. Quando voce escreve $(command), essa parte e substituida pela saida do comando.
Lina: Substituida? O que voce quer dizer?
Veterano Linny: Vamos ver na pratica. Quando voce escreve $(date), o shell executa date primeiro, troca $(date) pela saida, e so entao executa o comando completo.
$ echo "Hoje e $(date)"
Hoje e Fri Jun  5 12:00:00 JST 2026

Como a substituicao funciona

echo "Hoje e $(date)"
              ↓ executa date primeiro
echo "Hoje e Fri Jun 5 ... 2026"

O conteudo de $(...) se transforma em saida-como-texto antes que o comando externo seja executado.

2. Capturando Saida em uma Variavel

Conclusao: Use VAR=$(command) para armazenar a saida em uma variavel. Sem espacos ao redor do sinal =.

2-1. A forma basica

$ today=$(date +%Y-%m-%d)
$ echo "$today"
2026-06-05
Lina: A variavel today agora contem a data! Que pratico.
Veterano Linny: Isso mesmo. Uma vez na variavel, voce pode reutiliza-la quantas vezes quiser — em um nome de arquivo de log, em uma mensagem, em qualquer lugar.
$ logfile="backup-$today.log"
$ echo "$logfile"
backup-2026-06-05.log

2-2. Sem espacos ao redor do =

A atribuicao de variavel deve ter sem espacos ao redor do sinal =.

today = $(date)    # ERRADO: o shell procura um comando chamado "today"
today=$(date)      # correto

Com espacos, o shell trata today como um nome de comando.

3. Como Difere dos Backticks

Conclusao: Backticks fazem o mesmo trabalho, mas $(...) aninha de forma limpa e e mais legivel. Prefira-o.

Lina: Alguns artigos envolvem comandos em backticks, como `date`. O que e isso?
Veterano Linny: Essa e a sintaxe antiga para substituicao de comando. Ela funciona quase da mesma forma que $(date). Mas $(...) e a forma recomendada hoje.
Lina: Por que a mais nova e melhor?
# Sintaxe antiga (backticks)
$ echo "Hoje e `date`"

# Sintaxe nova (recomendada)
$ echo "Hoje e $(date)"

Por que $(...) e preferido

Aspecto Backticks ... $(...)
Aninhamento Dificil (precisa de escape) Funciona direto
Legibilidade Facil de confundir com ' Colchetes claros
Aspas Comportamento peculiar Direto ao ponto

Voce so precisa ler backticks. Quando escrever seus proprios scripts, use $(...).

4. Aninhando Substituicoes

Conclusao: Voce pode colocar $(...) dentro de $(...). O interno executa primeiro e alimenta o externo.

$ echo "$(basename $(pwd))"
myproject
Lina: Tem um $(...) dentro de outro $(...). Como isso executa?
Veterano Linny: E processado de dentro para fora. Primeiro $(pwd) se torna o caminho atual (digamos /home/user/myproject), depois basename pega isso e retorna apenas a ultima parte, myproject.

Fluxo de dentro para fora

basename $(pwd)
         ↓ executa pwd
basename /home/user/myproject
         ↓ executa basename
myproject

Com backticks voce teria que escapar os internos como \`. Com $(...) voce pode aninhar diretamente.

5. Por Que Voce Deve Usar Aspas

Conclusao: Envolver com "$(...)" mantem espacos e quebras de linha intactos como um unico valor seguro.

5-1. O que quebra sem aspas

$ files=$(ls)
$ echo $files        # sem aspas
Lina: A lista de arquivos foi impressa toda em uma linha. As quebras de linha desapareceram...
Veterano Linny: Essa e a armadilha sem aspas. O resultado de $(...) e dividido em palavras separadas nos espacos e quebras de linha (word splitting). Para manter quebras de linha e espacos como estao, envolva com aspas duplas.
$ echo "$files"      # com aspas
Documents
Downloads
report.txt

5-2. Na duvida, use aspas

Como regra, envolva resultados de substituicao com aspas duplas: "$(...)".

  • Nomes de arquivo com espacos nao vao quebrar
  • Quebras de linha sao preservadas
  • Um resultado vazio nao fara o argumento desaparecer e causar um erro

"So use aspas" previne a maioria dos acidentes comuns.

6. Armadilhas Comuns para Iniciantes

Conclusao: Quebras de linha finais sao removidas, e voce pode usar variaveis dentro de $() livremente.

6-1. Quebras de linha finais sao removidas

$ count=$(ls | wc -l)
$ echo "Existem $count arquivos"
Existem 3 arquivos

A substituicao de comando remove automaticamente a quebra de linha final da saida. Por isso voce pode inserir o numero diretamente em uma frase.

6-2. Variaveis e argumentos funcionam dentro de $()

$ dir=/etc
$ echo "Arquivos em $dir: $(ls "$dir" | wc -l)"
Arquivos em /etc: 220

Dentro de $(...) e apenas uma linha de comando normal. Variaveis, pipes e ate outras substituicoes funcionam.

6-3. Fique seguro quando o resultado esta vazio

$ result="$(grep "no such word" file.txt)"
$ echo "[$result]"
[]

Com aspas, um resultado de busca vazio simplesmente imprime []. Sem aspas, o argumento desaparece, o que pode causar comportamento inesperado.

7. Mini Exercicios

Conclusao: Tres tarefas — atribuir, incorporar e aninhar — para praticar o basico manualmente.

Lina: Entendi a teoria! Quero tentar eu mesma.
Veterano Linny: Otimo — aqui estao tres tarefas. Tente-as no seu terminal.

Tarefa 1: Armazene o nome do usuario atual em uma variavel chamada me e imprima-a (use whoami).

Mostrar dica

Use a forma name=$(command). Imprima com echo "$name".

Resposta exemplo
$ me=$(whoami)
$ echo "Eu sou $me"

Tarefa 2: Imprima a frase "O diretorio atual e ..." com a saida de pwd incorporada.

Mostrar dica

Use echo "... $(pwd) ..." e envolva com aspas duplas.

Resposta exemplo
$ echo "O diretorio atual e $(pwd)"

Tarefa 3: Imprima apenas o nome do diretorio atual (a ultima parte, nao o caminho completo) usando aninhamento.

Mostrar dica

Passe $(pwd) para basename: $(basename "$(pwd)").

Resposta exemplo
$ echo "$(basename "$(pwd)")"

basename pega o caminho de pwd e retorna apenas a ultima parte.

8. Templates para Copiar e Colar

Conclusao: Templates para atribuir, incorporar, nomear e contar — mantenha-os a mao.

Padroes uteis para guardar

# Armazenar saida em uma variavel
VAR=$(command)

# Incorporar em uma frase (sempre use aspas duplas)
echo "O resultado e $(command)"

# Construir um nome de arquivo com data
logfile="app-$(date +%Y%m%d).log"

# Contar linhas em uma variavel
count=$(ls | wc -l)

# Aninhar substituicoes
name="$(basename "$(pwd)")"

Proximas Leituras