Olá, pessoal! Dando continuidade à série de dicas "Diário de um SysAdmin", inicio o segundo capítulo, ainda no contexto Dicas | Macetes | Atalhos & Comandos, com mais 5 humildes contribuições.
Vale lembrar que a quinta dica sempre será um curiosidade do Shell, independentemente do contexto. Em especial, a curiosidade (Dica 5) desse capítulo é bem legal.
Em tempo, para quem não conferiu o capítulo 1, segue o link:
Dica 1 : Saltar rapidamente para o último diretório acessado
Quando usamos o terminal, navegamos por inúmeros diretórios, seja apenas visualizando ou até mesmo configurando, criando, apagando ou movendo arquivos, certo?
Às vezes, estamos em um determinado diretório fazendo algo e logo surge a necessidade de acessar um outro para configurar ou visualizar algum arquivo e então voltar ao diretório que estávamos. Isso, além de chato, é contraproducente.
A grande maioria, prefere ficar digitando o caminho absoluto para todos os comandos só para não precisar ficar saltando do diretório A para o B, depois do B para A, até porque, ficar digitando o caminho do diretório é igualmente chato e contraproducente. Concorda?
Então como resolver isso?
Simples, use o comando
cd - (usado com o comando
cd, o caractere " - " representa o último diretório acessado).
Exemplo real: você está no diretório "/home/nginx/localhost/public/moodle/blocks/" fazendo hardcoded em um bendito plug-in e percebe que não está rolando devido a alguma diretiva no NGinx, e não sabe ao certo em qual arquivo está essa bendita diretiva e, para piorar, se caso não estiver em nenhum arquivo, precisará criar um ".conf".
Para conseguir fazer isso do seu diretório atual, como falei acima, é tortura (hehe). Acho muito mais fácil e eficiente fazer assim:
cd /etc/nginx/sites-enabled/
/etc/nginx/sites-enabled $
Daí, executo os comandos que preciso e, para testar, eu volto ao diretório onde estava:
cd -
/home/nginx/localhost/public/moodle/blocks $
E se eu precisar voltar lá para configurar mais coisas, mando outro
cd -:
cd -
/etc/nginx/sites-enabled $
Resuminho: você está no diretório A, dai vai para o B, para voltar ao A (último diretório acessado), execute:
cd -
Bacana, não?
Dica 2: History time
Como vimos no capítulo anterior, rotineiramente, precisamos recorrer ao
history para facilitar nossa vida. Mas, às vezes, precisamos ver e/ou reexecutar uma "sequência" de comandos que foi realizada tempos atrás e, claro, você não lembra a data exata e/ou não consegue identificar quando começou e terminou a sequência desejada.
O
Ctrl+r ajuda, mas nesse caso não resolve 100% .
Mas, e se o history, além do comando, exibisse a data também?
Opa, aí sim! Então, 'bóra' implementar isso.
Rode o comando abaixo no terminal
HISTTIMEFORMAT="%d/%m/%y %T "
Agora, rode o history e pronto, estão aí os comandos executados e suas respectivas datas.
history
Pata entender melhor, veja abaixo:
Para definir permanentemente, faça assim:
echo 'export HISTTIMEFORMAT="%d/%m/%y %T " ' >> ~/.bashrc
source ~/.bashrc
Pronto! A partir de agora, o recurso estará implementado definitivamente.
Caso deseje voltar ao padrão (sem data), apague ou comente a seguinte linha no arquivo ~/.bashrc:
export HISTTIMEFORMAT="%d/%m/%y %T "
e reinicie ou recarregue as configurações.
Para apagar:
sed -i '/HISTTIMEFORMAT/d' ~/.bashrc
Para apenas desabilitar:
sed -i '/HISTTIMEFORMAT/ s/^/#/' ~/.bashrc
Recarregar:
source ~/.bashrc
Eu, particularmente, deixo desabilitado e só o uso quando realmente preciso.
Dica 3: Otimização inteligente de comandos II
Imagine que você precise criar vários diretórios e subdiretórios, seguindo uma hierarquia pré-determinada, porém, sem um padrão claro. Nada melhor do que um exemplo real para demonstrar isso:
Você recebe uma requisição assim:
- Criar em "/var/www" 10 diretórios chamados siteN (1 à 10)
- Dentro deles, as subpastas: config,js, img e php
- Dentro de php, criar as pastas: css, code e bkp
- Dentro de img, criar 30 subpastas (de x1 a x30)
- Dentro de config e js, não deve conter nada.
Se usássemos o método padrão, seria torturador (rs). Seriam + de 900 mkdir's, + de 1000 cd's e pelo menos 2 horas. Poderíamos também criar uma estrutura na mão e depois copiar e renomear, mas mesmo assim, seriam pelo menos 40 minutos de sofrimento.
Acredito que assim é melhor:
mkdir -p /var/www/site{1..10}/{php/{css,code,bkp},config,js,img/x{1..30}}
Pronto!
Ainda no tema otimizações inteligentes de comandos, aqui vai um complemento da dica do capítulo 1. No exemplo, fizemos uma cópia do "apache2.conf" para "apache2.conf.bkp" usando o comando:
# cp /etc/apache2/apache2.conf{,.bkp}
Alguns 'brothers' aqui do fórum, após lerem o artigo, me perguntaram como faríamos para modificar parte do nome e não só adicionar algo no final. Respondendo, seria assim: vamos supor que precise criar uma copia do "apache2.conf" chamada "apa_old.bkp". Basta fazermos assim:
# cp /etc/apache2/apa{che2.conf,_old.bkp}
Pronto, você acabou de criar uma cópia do arquivo "apache2.conf" chamada "apa_old.bkp", com um comando eficiente e rápido.
Para fixarmos, vamos ver mais um exemplo real, só que agora usando o comando
mv.
Você esta subindo um cms e após realizar as devidas configurações, precisa renomear o arquivo "config.sample.php" para "config.php".
Ao invés de fazermos assim:
mv /var/www/config.sample /var/www/config.php
Podemos fazer assim:
mv /var/www/config.{sample,php}
Com comandos eficientes, além de pouparmos tempo, dá uma sensação boa, nos sentimos mais poderosos. (rs)
Dica 4: Mais alguns truques e complementos
^errado^certo:
Imagine que você acabou de digitar e executar o seguinte comando:
tempo=300;lojas=100;lote=4;vezes=$(($lojas/$lote));contador=1 && for i in $(seq 1 $vezs);do for loja in $(seq $contador $(($contador+$lote - 1)));do ./lojas.sh $loja;contador=$(($contador+1));done && sleep $tempo;done
OK, ok. Dei uma exageradinha no tamanho do comando (rs). Mas é para fixar bem a importância da dica. (hehe)
Só que retorna erro, daí percebe que errou a digitação de algumas palavras (ao invés de vezes, escreveu vezs). Para corrigir isso, normalmente, apertaríamos a tecla pra cima de pois iríamos apertando a seta para esquerda, até que o cursor chegasse na palavra errada para então corrigi-la e por fim, reexecutar o comando. Certo?
Mas, e se fizéssemos assim:
^vezs^vezes
Pronto! Além de corrigir o comando, ele também o executa automaticamente.
Complementando a dica do capítulo 1 (
Ctrl+ k/u) e adicionado mais uma, o
Ctrl+y.
No capítulo 1, dica 4 (Atalhos Diversos) fiz a seguinte e errada definição:
Ctrl+k → apaga da posição atual do cursor até o fim da linha (direita).
Ctrl+u → apaga da posição atual do cursor até o começo da linha (esquerda).
A definição correta, é:
- Ctrl+k e Ctrl+u :: RECORTA e não apaga.
Para o propósito do exemplo, OK a dica funciona, mas o certo é o certo.
Aproveitando o gancho, vamos para mais um atalho, o
Ctrl+y.
Mesmo cenário: você está num server, portanto, sem X e mouse, digitou um comando e percebe que inverteu parte da lógica e precisa consertar isso. Vamos usar um exemplo real (dessa vez vou usar um curtinho - rs):
Você digitou:
ls -d | awk '{print$1}'| du -hm
E percebe que o bloco do
du deve vir antes do bloco do
awk. Como resolver sem apagar/redigitar?
R: Usando
Ctrl+u e
Ctrl+y
Posicione o cursor antes do caractere
pipe | do
du , aperte
Ctrl+k (isso vai recortar tudo que estiver à direita do cursor) depois posicione o cursor antes do
pipe " | " do
awk e aperte Ctrl+y (isso vai colar o conteúdo que acabou de recortar).
Pronto! Problema resolvido. Em um comando curto, talvez não pareça tão útil, mas em comando grande, salva a pele.
Dica 5: Curiosidades STAR WARS no Shell !!??
Que tal assistir Star Wars no Shell? Isso mesmo, em modo texto!
Sem mais delongas, vamos à dica. Pegue a pipoca, se acomode confortavelmente e execute o comando abaixo:
telnet towel.blinkenlights.nl
Para nerds como eu, isso é no mínimo, bem legal! ;)
Conclusão
Bom, é isso ai pessoal. Chegamos ao fim de mais um capítulo.
Espero que tenham gostado!
Tenham um ótimo dia!
Abração,
@Tonyhts.