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
- O conceito de substituição de comando
- Como capturar a saída de um comando em uma variável com
$(command) - Como
$(...)difere dos antigos backticks`...` - Por que você deve envolver com
"$(...)"usando aspasEnvolver um texto entre aspas (' ou ") para que seja tratado como um único valor, por exemplo um que tenha espaços.
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ável →
VAR=$(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.
date ele imprime a data de hoje. Eu quero usar esse resultado dentro de outro comando. Como eu faço?$(comando) e essa parte é substituída pela saída do comando.$(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
today agora contém a data! Que prático.$ 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.
`date`. O que é isso?$(date). Hoje a forma recomendada é $(...).# 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
$(...) dentro de outro $(...). Como isso executa?$(pwd) vira o caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório. atual, digamos /home/user/myproject.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
myprojectCom 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
$(...) é cortado em palavras separadas a cada espaço e quebra de linha. Isso se chama word splitting.echo reimprime essas palavras com um espaço entre cada uma. É por isso que parece uma linha só.$ 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.
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
$(comando) troca aquele ponto pela saída do comando.VAR=$(comando)."$(...)". Sem as aspas, o word splitting quebra tudo.$(...) 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
- O
$(comando)troca aquele ponto pela saída do comando - Para guardar o resultado, escreva
VAR=$(comando). Nunca coloque espaços ao redor do= - Ao usar o resultado, envolva com
"$(...)", senão espaços e quebras de linha dividem tudo