Como pesquisar eficientemente no histórico de comandos da Bash shell

Na linha de comandos, frequentemente queremos repetir algum procedimento, na íntegra ou com algumas modificações.
Para isso, há o histórico do Bash.
Você pode acessar o histórico da shell no arquivo .bash_history, que fica no seu diretório “home”. Veja como:

less ~/.bash_history

Você pode obter a mesma listagem, acrescida do número da linha de comando, com o próprio comando history:

history | less

Os números das linhas são úteis, por que podem ser evocados a qualquer momento no terminal. Ou seja, você não precisa redigitar o comando inteiro — basta fornecer o número dele no histórico.
Você pode combinar o history com o comando grep, para obter um histórico sobre um determinado item, que você tenha usado recentemente.
O exemplo abaixo lista o histórico de uso do comando apt:

history | grep apt

Veja como ficou a minha saída:

 1637  sudo apt install toilet
 1666  sudo apt update
 1667  apt list --upgradable 
 1668  apt show firmware-amd-graphics 
 1670  sudo apt autoremove 
 1671  sudo apt update
 1672  sudo apt full-upgrade 
 1673  sudo apt purge firmware-amd-graphics 
 1998  apt show zenity

Note que cada linha tem um número.
Se você quiser executar uma determinada linha de comando, use o símbolo ‘ ! ‘ (ponto de exclamação) seguido do número da linha correspondente:

!1668

history bash shell

Faça buscas por palavras dentro do histórico de comandos do Bash

Novamente, o comando grep pode ser usado para encontrar um nome de comando ou qualquer outra string dentro do .bash_history:

history | grep snap

Com o atalho de teclado ‘Ctrl+R’, é possível também fazer uma busca por uma string qualquer:

  • pressione simultaneamente as teclas ‘Ctrl’ e ‘R’
  • comece a digitar parte da palavra que deseja buscar
  • continue a pressionar ‘Ctrl+R’ até encontrar a linha de comando desejada

Quando encontrar, use a tecla de direcionamento para a direita ‘ → ‘, se quiser alterar o comando ou apenas tecle Enter, para executá-lo do jeito que ele já está.

Ovos de páscoa e comandos de voz divertidos do Google Now!

O Google Now tem uma série de hotwords ou palavras/frases de comando, que podem ser usadas para disparar ações, executar aplicativos, obter informações diversas e… brincar um pouco.
Neste post, vou me concentrar nas frases de comando que revelam ovos de páscoa ou easter eggs em inglês.
Como eles se referem à cultura de cinema e literária em língua inglesa, alguns destes comandos não fariam sentido se traduzidos para o português.
google-now-launcher

Algumas situações engraçadas, ativadas pelas frases de comando, são frutos de “erros de interpretação” da máquina de reconhecimento de voz e podem já ter sido corrigidos em aparelhos com softwares mais atualizados.

Você não precisa falar inglês com um sotaque perfeito de nativo (longe disso).
Para que seus comandos sejam entendidos pelo sistema de reconhecimento de voz, basta que você fale de forma clara.

A lista de comandos divertidos do Google Now

Veja a lista de hotwords, que revelam ovos de páscoa, na lista abaixo.
Não vou estragar sua surpresa. Experimente-os e veja o que acontece:

  • Do a barrel roll, gira a tela
  • What’s the lonliest number?
  • Make me a sandwich! — o programa irá responder Poof! You’re a sandwich?
  • Sudo make me a sandwich! (quem usa Linux, vai entender essa!) 😉
  • When am I?
  • Okay Jarvis!, em vez de “Ok Google!”
  • Who are you?
  • How much wood could a woodchuck chuck if a woodchuck could chuck wood? — Se você conseguir acertar este trava-línguas, vai ter uma resposta interessante.
  • Beam me up, Scotty! — frase famosa do seriado Star Trek! Tente entender a resposta, com a pronuncia característica do personagem.
  • Tilt! ou Askew! — “entorta” a tela do smartphone.
  • What is your favorite color? — o sistema responde que é difícil escolher uma e retorna uma busca (por imagens) de cores.
  • Up up down down left right left right! — este é o código Konami e é o que o sistema de busca vai mostrar.
  • What is the bacon number of [nome-de-um-ator] — o sistema irá informar o bacon number do ator que você citar.
    O bacon number é uma unidade de medida que calcula/revela a distância profissional de um(a) ator ou atriz em relação ao ator Kevin Bacon.
    O próprio Kevin tem o número 0, obviamente.
    Quem já trabalhou com ele, terá o número 1. Quem nunca trabalhou com Kevin Bacon, mas já trabalhou com quem trabalhou com ele, terá o número 2. Fácil de entender, não?
  • What does the fox say? — uma referência á música de uma dupla norueguesa. Se você perguntar várias vezes, vai obter respostas diferentes.
  • Lions, and Tigers, and Bears… — ao recitar esta passagem do “Mágico de OZ”, o Google Now irá responder com um “Oh my!” e mostrará resultados de pesquisa condizentes com o filme/livro.
  • Who are you? — irá retornar uma resposta “filosófica” dizendo que a resposta pode demorar uma vida, mas uma bom lugar para começar é no rock clássico. Exibe uma busca pela banda de rock The Who.
  • What is the airspeed velocity of an unladen swallow? ou “Qual a velocidade de voo
    de uma andorinha sem carga?” — em alusão ao filme Monty Python, Em Busca do Cálice Sagrado.
    O Google Now irá perguntar de volta se você se refere a uma andorinha africana (tal como o diálogo do filme).
    https://youtu.be/Ot2FypQHaYc
  • Who’s on first? ou “quem é o primeiro?”. Trata-se de uma alusão à comédia de Abbot & Costello. A primeira resposta do Google Now, será “Yes!“.
    Ao repetir a pergunta, ele(a) responderá “And What’s on second?“.
  • What is the nature of the universe? ou “qual a natureza do universo?” — em alusão ao episódio Remember Me de Star Trek: The Next Generation.
    A resposta será The universe is a spheroid structure 705 meters in diameter ou “o universo é uma estrutura esferoide com 705 metros de Diâmetro.

Conhece algum outro comando interessante, que não está na lista? Conta pra gente, nos comentários!
Divirta-se!

Como renomear múltiplos arquivos no Linux, com o comando rename.

O utilitário rename, escrito em Perl, pelo próprio Larry Wall, permite alterar os nomes de vários arquivos em lote, dentro de condições e regras que você mesmo pode estabelecer.
Normalmente, quando queremos renomear um arquivo ou diretório, no GNU/Linux, usamos o comando mv (move).
Quando o trabalho envolve uma grande quantidade de arquivos, o rename oferece mais flexibilidade, como ferramenta.
Vale aprender a utilizá-lo — até por que é uma maravilha se for integrado a algum script.
O cmando rename no Linux

Como usar o comando rename

O utilitário, tal como o seu nome indica, renomeia múltiplos arquivos ou grupos de arquivos.
Com o uso de expressões Perl, o rename pode alterar nomes de arquivos para “tudo” maiúsculas/minúsculas, entre outras coisas.
No exemplo. que segue, vou criar 4 arquivos para usar nos meus exemplos, com o comando touch:

touch abril2015.bak junho2015.bak maio2015.bak marco2015.bak

A seguir, renomear todos os arquivos criados, com extensão ‘.bak’ para a nova extensão ‘.backup’. Veja:

rename 's/\.bak$/\.backup/' *.bak

O comando, acima, se divide em dois argumentos:

  • No primeiro, temos a expressão em Perl 's/\.bak$/\.backup/' que substitui .bak por .backup
  • No segundo, é informado a que arquivos o comando se aplica: todos que têm extensão .bak

Veja o meu resultado:

ls -l

total 4
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 abril2015.backup
drwxrwxr-x 4 justincase justincase 4096 Out  1 16:36 box
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 junho2015.backup
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 maio2015.backup
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 marco2015.backup

Verifique as alterações antes de aplicá-las

Quando se vai executar uma tarefa em lotes e, como consequência, atingir vários arquivos ao mesmo tempo, é interessante ter certeza de que o efeito produzido seja exatamente o que se deseja.
Voltar atrás, depois de renomear dezenas, centenas ou milhares de nomes de arquivos, pode ser muito difícil.
Para isto, o comando rename dispõe de uma opção que simula seus efeitos, mostrando o que seria feito, para você poder avaliar se é o que deseja.
No comando abaixo, será pedido ao rename que simule a alteração das extensões dos arquivos de volta para .bak:

rename -n -v 's/\.backup$/\.bak/' *.backup

A opção ‘-n’, quer dizer no-act, ou seja, pede para que o rename não aja.
A opção ‘-v’, pede para que o programa seja verboso e conte tudo o que está fazendo.
O meu resultado, foi este:

abril2015.backup renamed as abril2015.bak
junho2015.backup renamed as junho2015.bak
maio2015.backup renamed as maio2015.bak
marco2015.backup renamed as marco2015.bak

Note que, ao pedir uma listagem do diretório…

ls -l

… Nada foi feito:

-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 abril2015.backup
drwxrwxr-x 4 justincase justincase 4096 Set 29 16:18 box
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 junho2015.backup
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 maio2015.backup
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 marco2015.backup

Como converter nomes de arquivos de minúsculas para maiúsculas e vice-versa

Para converter de minúsculas para maiúsculas, use a seguinte fórmula:

rename -v 'y/a-z/A-Z/' *.backup
abril2015.backup renamed as ABRIL2015.BACKUP
junho2015.backup renamed as JUNHO2015.BACKUP
maio2015.backup renamed as MAIO2015.BACKUP
marco2015.backup renamed as MARCO2015.BACKUP
[/bash]
Veja a minha listagem:


total 4
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 ABRIL2015.BACKUP
drwxrwxr-x 4 justincase justincase 4096 Set 29 16:18 box
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 JUNHO2015.BACKUP
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 MAIO2015.BACKUP
-rw-rw-r-- 1 justincase justincase    0 Out  1 11:41 MARCO2015.BACKUP

Para fazer a operação inversa, troque a posição dos caracteres na expressão 'y/a-z/A-Z/' para 'y/A-Z/a-z/'.

Como converter arquivos texto para formato binário (0 e 1) ou hexadecimal?

O comando xxd, do UNIX e do GNU/Linux pode ser usado para brincar, gerando saídas em sequências de 0 e 1. Também é usado, por hackers para alterar ou corrigir arquivos de programas em formato binário.
O comando xxd gera uma saída em hexadecimal ou hex dump a partir de um dado arquivo.
Ele pode fazer o processo contrário, também — ou seja, converter um arquivo com conteúdo em hexadecimal para o modo binário original ou texto.
binarytext-twitter-in-stream-photo
O procedimento de converter arquivos binários para hexadecimal é útil para transmitir dados naquele formato via email, de maneira segura, em formato ASCII.
Este procedimento também é útil para permitir que arquivos binários, possam ser editados em editores de texto comuns, sem sofrer danos.
Ao converter um arquivo binário para hexadecimal, é possível editá-lo com mais segurança — e depois converter de volta.
Normalmente, usam-se hex editors para isto. Mas, se você não tiver um por perto, pode usar este utilitário padrão no Unix/Linux.
Nos meus exemplos vou usar um trecho do poema ‘Não passou’, de Carlos Drummond de Andrade, dentro do meu arquivo ‘carlosdrummonddeandrade.txt’. Você pode usar qualquer outro arquivo texto, disponível no seu sistema:

cat carlosdrummonddeandrade.txt 
Não passou

(Carlos Drummond de Andrade)

Hoje somos mais vivos do que nunca.
Mentira, estarmos sós.
Nada, que eu sinta, passa realmente.
É tudo ilusão de ter passado

Para ver o texto representado em modo hexadecimal, use o xxd, sem opção alguma:

xxd carlosdrummonddeandrade.txt 
0000000: 4ec3 a36f 2070 6173 736f 750a 0a28 4361  N..o passou..(Ca
0000010: 726c 6f73 2044 7275 6d6d 6f6e 6420 6465  rlos Drummond de
0000020: 2041 6e64 7261 6465 290a 0a48 6f6a 6520   Andrade)..Hoje 
0000030: 736f 6d6f 7320 6d61 6973 2076 6976 6f73  somos mais vivos
0000040: 2064 6f20 7175 6520 6e75 6e63 612e 0a4d   do que nunca..M
0000050: 656e 7469 7261 2c20 6573 7461 726d 6f73  entira, estarmos
0000060: 2073 c3b3 732e 0a4e 6164 612c 2071 7565   s..s..Nada, que
0000070: 2065 7520 7369 6e74 612c 2070 6173 7361   eu sinta, passa
0000080: 2072 6561 6c6d 656e 7465 2e0a c389 2074   realmente.... t
0000090: 7564 6f20 696c 7573 c3a3 6f20 6465 2074  udo ilus..o de t
00000a0: 6572 2070 6173 7361 646f 0a              er passado.

Se preferir, você pode jogá-lo para dentro de outro arquivo. Para isto, informe o nome do arquivo de entrada seguido do nome do arquivo de saída:

xxd carlosdrummonddeandrade.txt carlosdrummonddeandrade.hex
cat carlosdrummonddeandrade.hex
0000000: 4ec3 a36f 2070 6173 736f 750a 0a28 4361  N..o passou..(Ca
0000010: 726c 6f73 2044 7275 6d6d 6f6e 6420 6465  rlos Drummond de
0000020: 2041 6e64 7261 6465 290a 0a48 6f6a 6520   Andrade)..Hoje 
0000030: 736f 6d6f 7320 6d61 6973 2076 6976 6f73  somos mais vivos
0000040: 2064 6f20 7175 6520 6e75 6e63 612e 0a4d   do que nunca..M
0000050: 656e 7469 7261 2c20 6573 7461 726d 6f73  entira, estarmos
0000060: 2073 c3b3 732e 0a4e 6164 612c 2071 7565   s..s..Nada, que
0000070: 2065 7520 7369 6e74 612c 2070 6173 7361   eu sinta, passa
0000080: 2072 6561 6c6d 656e 7465 2e0a c389 2074   realmente.... t
0000090: 7564 6f20 696c 7573 c3a3 6f20 6465 2074  udo ilus..o de t
00000a0: 6572 2070 6173 7361 646f 0a              er passado.

Como converter o arquivo para modo binário

Para ver a saída no modo binário, em vez de hexadecimal, use a opção ‘-b’.
Esta opção altera a formatação da saída para binary digits ou dígitos binários — ele reescreve o conteúdo do texto em octetos de zeros e uns.
Veja um exemplo:

xxd -b carlosdrummonddeandrade.txt 
0000000: 01001110 11000011 10100011 01101111 00100000 01110000  N..o p
0000006: 01100001 01110011 01110011 01101111 01110101 00001010  assou.
000000c: 00001010 00101000 01000011 01100001 01110010 01101100  .(Carl
0000012: 01101111 01110011 00100000 01000100 01110010 01110101  os Dru
0000018: 01101101 01101101 01101111 01101110 01100100 00100000  mmond 
000001e: 01100100 01100101 00100000 01000001 01101110 01100100  de And
0000024: 01110010 01100001 01100100 01100101 00101001 00001010  rade).
000002a: 00001010 01001000 01101111 01101010 01100101 00100000  .Hoje 
0000030: 01110011 01101111 01101101 01101111 01110011 00100000  somos 
0000036: 01101101 01100001 01101001 01110011 00100000 01110110  mais v
000003c: 01101001 01110110 01101111 01110011 00100000 01100100  ivos d
0000042: 01101111 00100000 01110001 01110101 01100101 00100000  o que 
0000048: 01101110 01110101 01101110 01100011 01100001 00101110  nunca.
000004e: 00001010 01001101 01100101 01101110 01110100 01101001  .Menti
0000054: 01110010 01100001 00101100 00100000 01100101 01110011  ra, es
000005a: 01110100 01100001 01110010 01101101 01101111 01110011  tarmos
0000060: 00100000 01110011 11000011 10110011 01110011 00101110   s..s.
0000066: 00001010 01001110 01100001 01100100 01100001 00101100  .Nada,
000006c: 00100000 01110001 01110101 01100101 00100000 01100101   que e
0000072: 01110101 00100000 01110011 01101001 01101110 01110100  u sint
0000078: 01100001 00101100 00100000 01110000 01100001 01110011  a, pas
000007e: 01110011 01100001 00100000 01110010 01100101 01100001  sa rea
0000084: 01101100 01101101 01100101 01101110 01110100 01100101  lmente
000008a: 00101110 00001010 11000011 10001001 00100000 01110100  .... t
0000090: 01110101 01100100 01101111 00100000 01101001 01101100  udo il
0000096: 01110101 01110011 11000011 10100011 01101111 00100000  us..o 
000009c: 01100100 01100101 00100000 01110100 01100101 01110010  de ter
00000a2: 00100000 01110000 01100001 01110011 01110011 01100001   passa
00000a8: 01100100 01101111 00001010                             do.

Se você prefere uma solução mais limpa, use a seguinte expressão:

xxd -b -g0 carlosdrummonddeandrade.txt | cut -d' ' -f2
010011101100001110100011011011110010000001110000
011000010111001101110011011011110111010100001010
000010100010100001000011011000010111001001101100
011011110111001100100000010001000111001001110101
011011010110110101101111011011100110010000100000
011001000110010100100000010000010110111001100100
011100100110000101100100011001010010100100001010
000010100100100001101111011010100110010100100000
011100110110111101101101011011110111001100100000
011011010110000101101001011100110010000001110110
011010010111011001101111011100110010000001100100
011011110010000001110001011101010110010100100000
011011100111010101101110011000110110000100101110
000010100100110101100101011011100111010001101001
011100100110000100101100001000000110010101110011
011101000110000101110010011011010110111101110011
001000000111001111000011101100110111001100101110
000010100100111001100001011001000110000100101100
001000000111000101110101011001010010000001100101
011101010010000001110011011010010110111001110100
011000010010110000100000011100000110000101110011
011100110110000100100000011100100110010101100001
011011000110110101100101011011100111010001100101
001011100000101011000011100010010010000001110100
011101010110010001101111001000000110100101101100
011101010111001111000011101000110110111100100000
011001000110010100100000011101000110010101110010
001000000111000001100001011100110111001101100001
011001000110111100001010

Qual a diferença entre SU e SUDO?

Ambos os comandos são lembrados quando se deseja realizar tarefas com privilégios administrativos no GNU/LINUX — tais como configurar alguns aplicativos ou serviços do sistema, instalar software etc.
Ainda que sejam utilizados em situações similares, ambos são diferentes e têm propósitos e comportamentos distintos.

O comando su

De acordo com a documentação oficial, o su (Switch User) serve para mudar o usuário corrente ou invocar o superusuário.
Com ele, você pode “incorporar” qualquer usuário no sistema, basta informar qual:

su keitel 
Senha: 
keitel@ultra:/home/justin/temp$ whoami
keitel

Obviamente, você precisa saber a senha do usuário para o qual você está mudando.
Se você for o root (administrador do sistema em questão), não precisa fornecer senha alguma. O root pode incorporar quem ele quiser — o que é útil para analisar alguma situação do ponto de vista do próprio usuário.
Se você precisar alterar arquivos de configuração específicas de algum usuário do sistema, é interessante fazer isto “como ele mesmo” — evitando de, na hora de gravar os arquivos, que sejam gravados como se o seu dono fosse o root. Se isto acontecesse, o arquivo ficaria indisponível para aquele usuário.
Para resumir, a função do comando su é trocar de usuário.

O comando sudo

O comando sudo não tem a função de trocar de usuário (embora até possa ajudar a fazer isto).
Seu trabalho é permitir que um usuário comum possa rodar algum comando com permissões elevadas, sem a necessidade de “trocar de identidade”.
Para poder usar o sudo, é necessário ser integrante do grupo “sudo”.
Se um usuário, que não tem privilégios para tanto, tentar rodar algum comando com o uso do sudo, o evento será relatado ao administrador do sistema.

O significado de sudo é superuser do, ou seja superusuário faça.

O comando sudo permite, ainda, que você execute uma tarefa como outro usuário (que não seja o root):

sudo -u keitel whoami
keitel

Para rodar algum comando, com privilégios de superusuário, não há a necessidade de informar o usuário root. Basta preceder o comando desejado, do sudo:

sudo apt-get update

A senha que o sudo pede é sempre a sua.
Esta é uma forma de o administrador do sistema compartilhar privilégios administrativos limitados a outros usuários, sem revelar a senha de root.
Você pode, ainda, iniciar uma sessão como root, usando apenas a sua senha, com o sudo:

sudo -i

Se você já tem alguma experiência com o uso do su ou do sudo, fique à vontade para compartilhar com a gente, na sessão de comentários, como você prefere usar estes comandos.