Use o calendário incluído na shell CLI do Android

A shell mksh, incluída nos dispositivos Android, desde a versão 4.2, vem acompanhada de uma série de utilitários interessantes.
O seu smartphone tem possibilidades que você mal desconfia.

Quando estiver sem Internet e sem nada pra fazer e apenas com o seu smartphone na mão, brincar na shell CLI (Command Line Interface, ou “Interface da Linha de Comando”) pode ser uma alternativa.

Sei que a grande maioria das pessoas, não vai achar este tipo de coisa interessante… mas, enfim, eu nunca fiz parte desta “grande maioria” e adoro descobrir coisas novas no terminal.
Antes de continuar, certifique-se de ter instalado um emulador de terminal em seu smartphone ou tablet.
Feito isso, vamos conhecer o comando cal.

Como obter informações sobre datas e calendários no Android com o comando cal

Já adivinhou que “cal” é abreviatura de calendar ou “calendário”?
É um utilitário tradicional do mundo UNIX/Linux.


cal

     Junho 2017       
do se te qu qu se sá  
             1  2  3  
 4  5  6  7  8  9 10  
11 12 13 14 15 16 17  
18 19 20 21 22 23 24  
25 26 27 28 29 30  

No Linux, o utilitário vai destacar o dia atual, do mês — o que não ocorreu na CLI do meu celular (Android 7 Nougat).
linux shell cal command
Você pode obter o calendário de um determinado mês e ano, com o seguinte comando:


cal 8 2019

Em que o primeiro parâmetro é o número do mês do ano e o segundo o ano.
calendar 8 August 2019
Desta forma, sempre que precisar saber em que dia da semana cai um determinado dia do ano ou do mês, você pode usar este método autenticamente geek para descobrir.

10 dicas para personalizar o prompt do seu terminal

Quem usa o terminal com frequência pode ver grande utilidade na exibição de determinadas informações na linha de comando, na parte que vem antes do cursor.
A personalização pode ser uma brincadeira muito divertida para usuários comuns — mas os administradores, que precisam acessar servidores diferentes podem se beneficiar com command line prompts diferenciados (o que ajuda a saber exatamente em que servidor e diretório você está executando algum comando).
Na série de artigos Como personalizar o prompt da linha de comando no UNIX/Linux, abordei várias formas de configurar:

  • parte 1  — ajustes básicos do prompt
  • parte 2  — como adicionar informações do sistema ao prompt e tornar as mudanças definitivas
  • parte 3  — como colorir o prompt de comando
  • parte 4  — como passar informações do prompt para a barra de títulos do seu terminal

Se você tiver dúvidas, sugiro a leitura dos textos acima. Assim evitamos redundâncias neste artigo e que ele fique mais longo do que o necessário. 😉

Em outras palavras, este post assume que você já detém o conhecimento do que foi discutido naqueles artigos, de forma que possamos ser bem mais objetivos aqui.

Se você acompanhar as tags emulador de terminal e bash vai encontrar outros textos interessantes relacionados a este assunto também.

Exemplos de prompt que você pode experimentar agora

Os exemplos, que seguem, podem ser experimentados de imediato. Basta copiar e colar no seu terminal Linux, Unix ou mesmo no Bash do Windows (eu não testei isso).
Sinta-se encorajada(o) a modificá-los para atender melhor às suas necessidades. Se quiser compartilhar alguma dica de uso, fique á vontade para postar nos comentários.
Como primeiro exemplo, veja este prompt que exibe um smiley sorrindo para comandos normais e um triste para quando você digitar um comando errado:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

experimente digitar comandos errados, para ver a mudança no “humor” do smiley.
O código abaixo, exibe uma carinha um pouco diferente para cada tipo de “humor”:

PS1="\`if [ \$? = 0 ]; then echo \\\^\\\_\\\^; else echo \\\-\\\_\\\-; fi\`*\u \w:\h)"

Uma variação deste prompt, exibe um smiley mais simples:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

Os próximos exemplos usam smileys coloridos:

PS1="\[\e[01;32m\]\u@\h \[\e[01;34m\]\W \`if [ \$? = 0 ]; then echo -e '\e[01;32m:)'; else echo -e '\e[01;31m:('; fi\` \[\e[01;34m\]$\[\e[00m\]"

A configuração abaixo acrescenta o número do comando no histórico, no começo da linha.

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

Se quiser saber mais sobre as cores e seus códigos, clique aqui.
Prompts em múltiplas linhas, podem conter uma quantidade maior de informações. Por outro lado, alguns usuários acham que isto polui o visual do terminal, que deveria ser um pouco mais espartano.
exemplo de prompt de comando
Se você não se importa com uma ou duas linhas a mais no prompt, mas prefere obter algumas informações imediatas, o exemplo que segue exibe o número de arquivos presentes no diretório atual e o espaço ocupado por eles.

PS1="\n\[\033[35m\]\$(/bin/date)\n\[\033[32m\]\w\n\[\033[1;31m\]\u@\h: \[\033[1;34m\]\$(/usr/bin/tty | /bin/sed -e 's:/dev/::'): \[\033[1;36m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files \[\033[1;33m\]\$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\033[0m\] -> \[\033[0m\]"

Ao contrário do anterior, este é simples (espartano), só que usa cores. Você pode usá-lo, como base, para criar algo mais sofisticado.

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Segue uma versão minimalista em 2 linhas:

PS1="[\[\033[32m\]\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

Gosto muito desta versão, abaixo, com informações sobre o diretório atual e sem excesso de cores:

PS1="\n\[\e[30;1m\]\[\016\]l\[\017\(\[\e[34;1m\]\u@\h\[\e[30;1m\])-(\[\e[34;1m\]\@ \d\[\e[30;1m\])->\[\e[30;1m\]\n\[\016\]m\[\017\]-(\[\[\e[32;1m\]\w\[\e[30;1m\])-(\[\e[32;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Atualmente, gosto do meu assim:

PS1="\n\[\e[34;1m\]\u@\h\[\e[30;1m\] \[\e[34;1m\][ \d, \@]\[\e[30;1m\]\n\[\e[30;1m\]kernel: \$(/bin/uname -r)\n\[\e[32;1m\]\w\[\e[30;1m\] (\[\e[34;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') arquivos, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Referências

https://slashdot.org/comments.pl?sid=108424&cid=9219400.
https://www.maketecheasier.com/8-useful-and-interesting-bash-prompts/.

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 4

A personalização do prompt da linha de comando pode ir além de todas aquelas as informações sobre o sistema antes do cursor.
Se você prefere ter menos “coisas” no prompt, mas não quer abrir mão de algumas informações, saiba que é possível enviar alguns destes itens para a barra de títulos do console.
Tudo o que você precisa é acrescentar um pouquinho de código ao que você já tem no seu PS1 — como foi abordado na parte 1, parte 2 e parte 3 desta série de artigos.
O pedaço de código a mais segue aí, embaixo:

"\e]2;texto para a barra de titulo\a"

Basta substituir a cadeia “texto para a barra de titulo” pelo que você achar melhor.
O código para inserir data e hora na barra de título segue abaixo:

\e]2;\d, \t - \u@\h\a

Para ter efeito imediato, acrescente este código ao valor do seu PS1, conforme destacado, abaixo:

PS1='\e]2;\d, \t - \u@\h\a \[\e[0;33m\][\T]\n\[\e[1;36m\] \w > \[\e[0;32m\]'

data hora barra de título

Obviamente, o recurso nem sempre vai funcionar. Quando você estiver usando uma interface 100% caractere (CLI), conectado remotamente a um sistema headless ou, simplesmente, usando o terminal em tela cheia (F11), por exemplo.
Nestes casos, não será possível ver qualquer barra de títulos.

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á.

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/'.