Não importa se você está aprendendo a usar o terminal ou se já é um profissional experiente, sempre há muitos truques que podem economizar seu tempo.
Separamos três truques úteis do Bash para você adicionar ao seu repertório.
Substituição de Processos: Transformando Dados em Arquivos Temporários
Você provavelmente já se deparou com uma situação em que precisava de um caminho para um arquivo como argumento, mas tudo o que tinha era dado.
Por exemplo, vamos supor que você queira editar um texto que já está no terminal:
echo "foo" | nano
Esse comando não funciona, pois você não pode enviar dados diretamente para o nano; em vez disso, é necessário fornecer um caminho para um arquivo, como nano /caminho/para/arquivo.txt.
Para resolver esse problema, você provavelmente usará uma sequência de comandos parecida com a seguinte:
echo foo > bar.txt nano bar.txt
Nesse exemplo, são utilizados dois comandos separados: primeiro, cria-se um arquivo e, em seguida, o utiliza-se.
Essa abordagem é subótima, pois deixa arquivos espalhados pelo sistema e você também precisa digitar o caminho. A substituição de processos resolve esse problema:
echo <(true)
Isso gera um caminho temporário, por exemplo: /dev/fd/16.
A substituição de processos cria, a partir da saída de um comando, um arquivo temporário que outro comando pode ler. No exemplo acima, “<(true)” gera um caminho e o comando echo o recebe. O dado disponível é simplesmente a palavra “true”.
A parte “fd” do caminho refere-se a “descritor de arquivo”, que é um identificador utilizado por programas para referenciar arquivos abertos internamente. Cada processo possui seus próprios descritores, e neste caso o echo os utiliza.
Veja um exemplo prático com substituição de processos:
nano <(echo "foo")
Esse comando é equivalente a digitar:
echo "foo" > /tmp/foo nano /tmp/foo
Você não conseguirá salvar e editar o texto ao executar nano <(echo “foo”) porque o arquivo criado é somente leitura, mas é possível alterar o local de salvamento utilizando o atalho Ctrl+O.
Substituição de Processos de Entrada/Saída
A expressão <(comando) cria uma substituição de processos de entrada. Alternativamente, você também pode criar uma substituição de processos de saída:
echo "foo" > >(cat)
Esse comando equivale a:
echo "foo" > /tmp/foo cat /tmp/foo
Resumindo:
- echo <(true) é uma substituição de processo de entrada, onde o comando
echorecebe os dados através de um caminho especial (neste caso, o dado é apenas “true”). - echo “foo” > >(cat) é uma substituição de processo de saída, onde o
catrecebe a palavra “foo” através de um caminho especial. Lembre que o primeiro caractere “>” é o operador de redirecionamento, e o segundo faz parte da expressão de substituição.
Para encerrar essa seção, um exemplo prático para juntar tudo:
diff <(ls -1 ~) <(ls -1 /tmp)
Esse comando compara as diferenças entre duas pastas. Nesse caso, a substituição de processo de entrada é útil, pois o diff espera receber caminhos para arquivos, e é exatamente isso que a substituição de processos fornece.
Observação: a flag ls -1 é o número um, e não a letra “l”.
Expansão do Histórico: Repetindo Comandos
Os próximos três exemplos utilizam expansão do histórico. Essas expressões transformam entradas simples de caracteres em itens do histórico do seu shell.
Duplo Sinal de Exclamação!
Esse é um dos comandos que mais utilizo, logo após cd e ls. É simples de usar e entender, e simplesmente reexecuta o último comando que você executou.
ls !!
Você pode notar, pela saída do comando, que o ls foi executado duas vezes.

Expandindo um Item Específico do Histórico
Primeiro, consulte seu histórico para encontrar o comando desejado:
history
Depois, escolha um dos números à esquerda e insira-o como !N:
!N

O interessante dessa expansão com números é que eles permanecem consistentes, permitindo que você se familiarize com eles. Essa familiaridade, no entanto, só dura enquanto o arquivo ~/.bash_history não for excluído.
Expandindo pela Primeira Parte do Comando
Procurar entre o histórico e localizar um comando específico pode se tornar tedioso. Uma abordagem alternativa e mais eficiente é que o Bash permite que você digite parcialmente o começo de um comando, e ele executa a correspondência mais recente.
echo foo !e !ech
Isso é ideal para alternar entre diversos comandos durante uma sessão única no terminal. Para comandos mais antigos, pode ser útil utilizar alguma ferramenta de busca por histórico mais avançada.
Grupos de Comandos
Em algumas situações, você pode querer executar uma série de comandos como se fossem um grupo único, tratando sua saída como um único resultado. Considere o seguinte exemplo:
echo foo > /tmp/foo.txt echo bar >> /tmp/foo.txt
O comando acima cria um arquivo com o seguinte conteúdo:
foo bar
Quando os comandos se tornam mais complexos, essa abordagem pode ficar confusa devido às linhas desnecessárias. A alternativa mais simples é usar um grupo de comandos.
Um grupo de comandos reúne todas as saídas dos comandos em um só fluxo, tornando o processamento do resultado mais direto.
{ echo foo; echo bar; } > /tmp/foo.txt
Isso resulta no mesmo conteúdo do exemplo anterior. Note que o redirecionamento é feito apenas uma vez, dispensando o uso do operador de anexação (>>).
É importante colocar um ponto-e-vírgula após cada comando, inclusive o final, e manter espaços entre as chaves e os comandos.
Para comprovar que os comandos externos ao grupo são executados apenas uma vez, experimente o seguinte:
{ echo "A"; echo "B"; } | wc -l

Um exemplo prático do uso real:
{ ping -c 1 example.com; ping -c 1 example.net; } > /tmp/ping.txt
Em resumo:
- A substituição de processos transforma a saída de um comando em um caminho temporário. Por exemplo, nano <(echo “foo”) e echo “foo” > >(cat).
- As expansões do histórico do shell permitem referenciar comandos anteriores facilmente, seja usando !foo, !N ou !!.
- Um grupo de comandos une as saídas de diversos comandos em um único resultado, como em { echo “foo”; echo “bar”; } > /tmp/foo.txt.
O que foi abordado aqui é apenas a superfície do que o Bash pode oferecer.
Conteúdo por How to Geek.



