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 variavel →
VAR=$(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.
date ele imprime a data de hoje. Como eu uso esse resultado dentro de outro comando?$(command), essa parte e substituida pela saida do comando.$(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
today agora contem a data! Que pratico.$ 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.
`date`. O que e isso?$(date). Mas $(...) e a forma recomendada hoje.# 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
$(...) dentro de outro $(...). Como isso executa?$(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
myprojectCom 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
$(...) 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.
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)")"