Substituição de Comando: Capturando Saída com $(...)

Substituição de Comando: Capturando Saída com $(...)

O que você vai conseguir fazer

  • Incorporar o resultado de um comando em uma frase com `$(comando)`
  • Guardar o resultado de um comando em uma variável com `VAR=$(comando)`
  • Explicar por que se envolve com `"$(...)"` e como os backticks se diferenciam

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

As palavras usadas aqui

  • Variável: uma caixa com nome que guarda um valor. Escreva o nome e você recebe o conteúdo.
  • Substituição de comando: uma forma de colocar a saída de um comando em uma linha, como texto. Também chamada de capturar a saída.
  • Aspas: "..." são aspas duplas e '...' são aspas simples.

Todos os comandos deste artigo -- date, pwd, whoami, ls -- apenas exibem coisas. Nenhum deles apaga ou edita arquivos, então um erro de digitação não danifica o seu computador.

Resumo Rápido

  • Armazenar saída em uma variávelVAR=$(command)
  • Incorporar saída em texto → echo "Hoje e $(date)"
  • Na dúvida, envolva com aspas duplas: "$(...)"

1. O Que é Substituição de Comando?

Conclusão: A substituição de comando executa um comando e substitui $(...) pela sua saída, inline.

Lina: Senpai, quando eu executo date ele imprime a data de hoje. Eu quero usar esse resultado dentro de outro comando. Como eu faço?
Veterano Linny: É exatamente para isso que a substituição de comando serve. Escreva $(comando) e essa parte é substituída pela saída do comando.
Lina: Substituída? O que isso quer dizer?
Veterano Linny: Imagine uma carta com lacunas. Você consulta a data, escreve na lacuna e só então lê tudo em voz alta.
Veterano Linny: Com $(date), o shellUm programa interativo que interpreta os comandos digitados e os executa. executa o date primeiro. Ele troca $(date) pela saída. Só então executa o comando completo.
$ echo "Hoje e $(date)"
Hoje e Fri Jun  5 12:00:00 JST 2026

Como a substituição funciona

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

O conteúdo de $(...) se transforma em saída-como-texto antes que o comando externo seja executado.

2. Capturando Saída em uma Variável

Conclusão: Use VAR=$(command) para armazenar a saída em uma variável. Sem espaços ao redor do sinal =.

2-1. A forma básica

$ today=$(date +%Y-%m-%d)
$ echo "$today"
2026-06-05
Lina: A variável today agora contém a data! Que prático.
Veterano Linny: Isso mesmo. Uma vez na variável, você pode reutilizá-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 espaços ao redor do =

Uma atribuição de variável deve ter nenhum espaço ao redor do sinal =.

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

Com espaços, o shell lê today como um nome de comando. Você então recebe command not found.

3. Como Difere dos Backticks

Conclusão: Backticks fazem o mesmo trabalho, mas $(...) aninha de forma limpa e é mais legível. Prefira-o.

Lina: Alguns artigos envolvem comandos em backticks, como `date`. O que é isso?
Veterano Linny: Essa é a sintaxe antiga da substituição de comando. Ela funciona quase igual ao $(date). Hoje a forma recomendada é $(...).
Lina: Por que a mais nova é melhor?
# Sintaxe antiga (backticks)
$ echo "Hoje e `date`"

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

Por que $(...) é preferido

Aspecto Backticks `...` $(...)
Aninhamento Difícil (precisa de escape) Funciona direto
Legibilidade Fácil de confundir com ' Colchetes claros
Aspas Comportamento peculiar Direto ao ponto

Entender backticks basta para ler artigos antigos. Quando escrever os seus próprios, use sempre $(...).

4. Aninhando Substituições

Conclusão: Você 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: É processado de dentro para fora. Primeiro o $(pwd) vira o caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório. atual, digamos /home/user/myproject.
Veterano Linny: Depois o basename pega esse caminho e retorna apenas a última parte, myproject. O basename é o comando que reduz um caminho ao nome final.

Fluxo de dentro para fora

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

Com backticks, você teria que reescrever os internos como \`. Essa reescrita se chama escape, e ela dá trabalho.

Com $(...) você pode aninhar diretamente. Essa é a maior vantagem.

5. Por Que Você Deve Usar Aspas

Conclusão: Envolver com "$(...)" mantém espaços e quebras de linha intactos como um único valor seguro.

5-1. Lina se atrapalha: as quebras de linha somem

$ files=$(ls)
$ echo $files        # sem aspas
Documents Downloads report.txt
Lina: A lista de arquivos saiu toda em uma linha só. As quebras de linha sumiram. A variável foi danificada?
Veterano Linny: Nada foi danificado. As quebras de linha continuam lá dentro.
Lina: O conteúdo sobreviveu? Isso me surpreende.
Veterano Linny: Sim. O que quebrou foi a forma de entregar. Sem aspas, o resultado de $(...) é cortado em palavras separadas a cada espaço e quebra de linha. Isso se chama word splitting.
Veterano Linny: Depois o echo reimprime essas palavras com um espaço entre cada uma. É por isso que parece uma linha só.
Lina: Então era a entrega, e não o conteúdo. Agora fez sentido.
$ echo "$files"      # com aspas
Documents
Downloads
report.txt

5-2. Na dúvida, use aspas

Como regra, envolva resultados de substituição com aspas duplas: "$(...)".

  • Nomes de arquivo com espaços não vão quebrar
  • Quebras de linha são preservadas
  • Um resultado vazio não fará o argumento desaparecer e causar um erro

Transformar "na dúvida, use aspas" em hábito previne a maioria dos acidentes comuns.

6. Armadilhas Comuns para Iniciantes

Conclusão: Quebras de linha finais são removidas, e você pode usar variáveis dentro de $() livremente.

6-1. Quebras de linha finais são removidas

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

A substituição de comando remove sozinha a quebra de linha final da saída. Por isso você pode inserir o número diretamente em uma frase.

6-2. Variáveis e argumentos funcionam dentro de $()

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

Dentro de $(...) é apenas uma linha de comando normal. Variáveis, pipes e até outras substituições funcionam.

6-3. Fique seguro quando o resultado está vazio

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

Com aspas, um resultado de busca vazio simplesmente imprime [].

Sem aspas, o próprio argumento desaparece. Essa é uma causa comum de comportamento inesperado.

7. Mini Exercícios

Conclusão: Três tarefas — atribuir, incorporar e aninhar — para praticar o básico manualmente.

Lina: Entendi a teoria. Quero tentar eu mesma.
Veterano Linny: Ótimo. Aqui estão três exercícios. Execute-os no seu terminal.

Exercício 1: Guarde o nome do usuário atual em uma variável chamada me e mostre-o dentro de uma frase.

Ver Dica 1 (Direção)

Primeiro execute o comando que informa o seu nome de usuário. Coloque o resultado em uma caixa e depois retire-o como parte de uma frase.

Ver Dica 2 (Nome do comando)

O nome de usuário vem do whoami. A forma de guardar é nome=$(comando). Para mostrar, use echo.

Ver Resposta
$ me=$(whoami)
$ echo "Eu sou $me"
Eu sou lina

O nome que aparece depende da sua conta.

Exercício 2: Mostre a frase "O diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. atual e ..." com a saída do pwd incorporada.

Ver Dica 1 (Direção)

Desta vez sem variável. Coloque a saída do comando direto no meio de uma frase.

Ver Dica 2 (Nome do comando)

A sua localização vem do pwd. Envolva a frase inteira em aspas duplas e insira $(pwd).

Ver Resposta
$ echo "O diretorio atual e $(pwd)"
O diretorio atual e /home/lina/myproject

O caminho que aparece depende de onde você está.

Exercício 3: Mostre apenas o nome do diretório atual. Ou seja, a última parte, e não o caminho inteiro.

Ver Dica 1 (Direção)

São dois passos. Primeiro obtenha o caminho completo de onde você está. Depois retire desse caminho apenas o nome final.

Ver Dica 2 (Nome do comando)

O caminho completo vem do pwd. O nome final vem do basename. Aninhe um $(...) dentro do outro.

Ver Resposta
$ echo "$(basename "$(pwd)")"
myproject

O basename pega o caminho do pwd e retorna apenas a última parte. Repare que o $(pwd) interno executa primeiro.

8. Revisão

Lina: Vou resumir. O $(comando) troca aquele ponto pela saída do comando.
Veterano Linny: Isso. E quando você quer guardar o resultado, use VAR=$(comando).
Lina: E ao usar o resultado, envolvo com "$(...)". Sem as aspas, o word splitting quebra tudo.
Veterano Linny: É isso. Ler backticks já basta; escreva $(...) nos seus próprios comandos.

9. Templates para Copiar e Colar

Conclusão: Templates para atribuir, incorporar, nomear e contar — mantenha-os à mão.

Padrões úteis 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)")"

Resumo do Dia em 3 Linhas

  1. O $(comando) troca aquele ponto pela saída do comando
  2. Para guardar o resultado, escreva VAR=$(comando). Nunca coloque espaços ao redor do =
  3. Ao usar o resultado, envolva com "$(...)", senão espaços e quebras de linha dividem tudo

Próximas Leituras