Trabalho rápido e eficaz na linha de comando

Existem muitas dicas e truques de linha de comando na internet. A maioria deles descreve os triviais como "aprenda as teclas de atalho" ou " sudo !! executará o comando anterior com o sudo". Em vez disso, vou lhe dizer o que fazer quando você já aprendeu as teclas de atalho e conhece o sudo !! .


O terminal deve iniciar instantaneamente


Quanto tempo você gasta para lançar um terminal? E outro? Por um longo tempo, usei o atalho Ctrl + Alt + T para iniciar um terminal e achei rápido. Quando migrei do Openbox para o i3, comecei a lançar um terminal via Win + Enter, que funcionava de forma imediata. Você sabe o que? Agora não acho que Ctrl + Alt + T seja rápido o suficiente.


Obviamente, a coisa não é uma aceleração de milissegundos, mas você abre um terminal no nível dos reflexos, completamente alheio a isso.


Portanto, se você costuma usar um terminal, mas pega um mouse para iniciá-lo, tente configurar uma tecla de atalho útil. Tenho certeza que você vai gostar.


Zsh em vez de bash


Este é um tópico da guerra santa, eu sei. Você deve instalar o Zsh para pelo menos três recursos: preenchimento automático avançado, correção de erros de digitação e conclusão de vários nomes de caminhos: quando uma única guia converte /u/s/d em /usr/share/doc . O Arch Linux já migrou para o Zsh em seu CD de instalação. Espero que o Zsh se torne um shell padrão no Ubuntu. Esse será um momento histórico.


Começar a usar o Zsh não é nada difícil. Basta instalá-lo via gerenciador de pacotes e encontrar uma configuração bonita. Eu recomendo levar a configuração usada no Arch Linux:


 $ wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc 

A única coisa que resta é mudar o seu shell padrão e entrar novamente.


 $ chsh -s $(which zsh) 

É tudo, continue trabalhando como se nada tivesse acontecido.


Como o prompt do shell deve se parecer


O prompt do shell é um pequeno pedaço de texto mostrado no terminal no início da sua linha de comando. Deve ser configurado para o seu tipo de trabalho. Você pode percebê-lo como o painel de instrumentos de um veículo. Por favor, coloque algumas informações úteis, deixe-o ajudá-lo a navegar! Torne-o útil, especialmente se você o vê todos os dias!


O prompt do shell deve ser colorido. Não concorda? Tente contar quantos comandos foram executados neste terminal:



E agora com cores:



O prompt do shell deve exibir um diretório de trabalho atual de um shell. Se o diretório de trabalho atual não for exibido, mantenha-o em mente e verifique-o periodicamente com o comando pwd . Por favor, não faça isso. Lembre-se de algumas coisas realmente importantes e não perca tempo com o comando pwd .


Se você mudar para a conta raiz, precisará de uma indicação de "usuário atual". O nome de usuário específico geralmente não é importante, mas seu status (regular ou raiz) é. A solução é usar o prompt de shell color: red para raiz e verde para usuário comum. E você nunca assumirá o shell raiz como regular.


Se você se conectar a servidores usando ssh, precisará distinguir seus shells locais e remotos. Para esse propósito, o prompt do shell deve conter um nome de host ou, melhor ainda, indicar uma conexão ssh.


O prompt do shell pode mostrar o código de saída do último comando. Lembre-se de que o código de saída zero significa que um comando foi encerrado com sucesso, diferente de zero - o comando foi encerrado sem êxito. Você pode obter o código de saída do último comando via echo $? , mas digitar tudo isso é uma coisa muito longa. Deixe o shell mostrar uma saída sem êxito.


Se você trabalha com repositórios Git, será útil ver o status do repositório no prompt do shell: branch atual e o estado do diretório de trabalho. Você economizará algum tempo com os comandos git status e git branch e não se comprometerá com uma ramificação errada. Sim, o cálculo do status pode levar um tempo significativo nos repositórios de gordura, mas para mim os profissionais superam os contras.


Algumas pessoas adicionam clock ao prompt do shell ou até o nome de um terminal virtual (tty), ou alguns rabiscos arbitrários. Isso é tudo supérfluo. É melhor manter muito espaço para comandos.


É assim que meu prompt de shell se parece em diferentes condições:



Você pode ver na captura de tela que a barra de título do terminal faz o trabalho semelhante. Também é parte de um painel e também deve ser configurado.


Então, como tudo isso deve ser implementado no .zshrc ? A variável PROMPT define o prompt esquerdo e RPROMPT define o prompt direito. A variável EUID define o status de um usuário (regular ou raiz) e a presença SSH2_CLIENT ou SSH2_CLIENT indica conexão ssh. Para que possamos ter um modelo:


 if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi else # not SSH if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi fi 

Não mostro o código pronto para copiar e colar, pois a implementação exata é uma questão de gosto. Se você não quiser se incomodar e a captura de tela acima estiver correta para você, então pegue meu cofig no Github .


Resumo:


  • Prompt de shell colorido é um deve ter.
  • O mínimo necessário é um diretório de trabalho atual.
  • A casca da raiz deve estar claramente visível.
  • O nome de um usuário não se importa com uma carga útil se você usar apenas uma conta.
  • O nome do host é útil se você se conectar aos servidores via ssh, não é obrigatório se não o fizer.
  • É útil ver o código de saída sem êxito de um último comando.
  • O status do repositório Git economiza tempo nos comandos git status e git branch e traz à prova de falhas.

Use fortemente o histórico de comandos


Na maior parte dos comandos da sua vida, você digita mais de uma vez; portanto, seria legal retirá-los da história em vez de digitar novamente. Todos os shells modernos salvam um histórico de comando e fornecem várias maneiras de pesquisar nesse histórico.


Talvez você já consiga cavar o histórico usando as teclas Ctrl + R. Infelizmente, tem duas desvantagens:


  1. A linha de comando deve estar vazia para iniciar a pesquisa, ou seja, no caso "alguém começou a digitar um comando - lembrado da pesquisa", você deve limpar sua digitação primeiro e, em seguida, pressionar Ctrl + R e repetir sua entrada. Isso leva muito tempo.
  2. A pesquisa direta não funciona por padrão, pois Ctrl + S para o terminal.

O tipo de pesquisa mais rápido e conveniente funciona desta maneira:


  1. Você começa a digitar um comando,
  2. você se lembra da pesquisa,
  3. você pressiona uma tecla de atalho e o shell oferece comandos do histórico que começaram da mesma maneira.

Por exemplo, você deseja sincronizar um diretório local com um remoto usando o Rsync e já o fez duas horas antes. Você digita rsync , pressiona uma tecla de atalho uma ou duas vezes e o comando desejado está pronto para ser iniciado. Você não precisa ativar o modo de pesquisa primeiro, o prompt do shell não muda para (reverse-i-search)': e nada salta em qualquer lugar. Você está apenas percorrendo o histórico da mesma maneira que pressiona as setas ↑ ↓ para percorrer os comandos inseridos anteriormente, mas com filtragem adicional. Isso é muito legal e economiza muito tempo.


Esse tipo de pesquisa não funciona por padrão no Bash e no Zsh, então você deve habilitá-lo manualmente. Eu escolhi o PgUp para pesquisar para frente e o PgDown para pesquisar para trás. É longe de alcançá-los, mas eu já criei um hábito. Talvez mais tarde eu mude para algo mais próximo como Ctrl + P e Ctrl + N.


Para o Bash, você precisa adicionar algumas strings em /etc/inputrc de ~/.inputrc :


 "\e[5~": history-search-backward "\e[6~": history-search-forward 

Se você .zshrc um .zshrc completo estrangeiro, é altamente provável que o PgUp e o PgDown já façam o trabalho. Caso contrário, adicione a ~/.zshrc :


 bindkey "^[[5~" history-beginning-search-backward # pg up bindkey "^[[6~" history-beginning-search-forward # pg down 

Os reservatórios Fish e Ipython já possuem essa pesquisa vinculada às setas ↑ ↓. Eu acho que muitos usuários migraram para o Fish apenas pelo comportamento das flechas. Obviamente, é possível vincular as setas dessa maneira no Bash e no Zsh, se desejar. Use isso em /etc/inputrc de ~/.inputrc :


 "\e[A":history-search-backward "\e[B":history-search-forward 

E isso em ~/.zshrc :


 autoload -U up-line-or-beginning-search autoload -U down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search bindkey "^[[A" up-line-or-beginning-search bindkey "^[[B" down-line-or-beginning-search 

É curioso que, com o tempo, comecei a escrever comandos tendo em mente que mais tarde os retirarei da história. Deixe-me mostrar algumas técnicas.


Junte-se aos comandos que sempre se seguem:


 # ip link set eth1 up && dhclient eth1 # mkdir /tmp/t && mount /dev/sdb1 /tmp/t 

Caminhos absolutos em vez de relativos permitem executar um comando a partir de qualquer diretório:
vim ~/.ssh/config vez de vim .ssh/config , systemd-nspawn /home/chroot/stretch vez de systemd-nspawn stretch e assim por diante.


O uso de curinga torna seus comandos mais universais. Eu costumo usá-lo em conjunto com chmod e chown .


 # chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq 

Atalhos do teclado


Aqui está o mínimo necessário.


Alt +. - substitui o último argumento do comando anterior. Também pode ser acessado com !$ .
Ctrl + A, Ctrl + E - pula para o início e o final da linha, respectivamente.
Ctrl + U, Ctrl + Y - recortar e colar. É útil quando você digita um comando complexo e percebe que precisa executar outro primeiro. Hmm, onde salvar a entrada atual? Bem aqui.
Ctrl + W - mata uma palavra antes do cursor. Limpa a linha ao pressionar e segurar. Por padrão, a entrada é salva na área de transferência (usada para Ctrl + Y).
Ctrl + K - corta a parte da linha após o cursor, adicionando-a à área de transferência. Ctrl + A Ctrl + K limpa rapidamente a linha.
PgUp, PgDown, Ctrl + R - pesquisa de histórico.
Ctrl + L limpa o terminal.


Capacidade de resposta do teclado


Quero mostrar uma pequena configuração que permite rolar, navegar e apagar mais rapidamente. O que fazemos quando queremos apagar algo grande? Pressionamos e mantemos Backspace e assistimos a ele voltar a limpar caracteres. O que está acontecendo exatamente? Depois que o Backspace é pressionado, um caractere desaparece, passa um pequeno atraso e a repetição automática é acionada: O Backspace apaga os caracteres um por um, como se você o pressionasse repetidamente.


Eu recomendo que você ajuste o atraso e a frequência de repetição automática para a velocidade dos seus dedos. O atraso é necessário quando você deseja apagar apenas um caractere - ele oferece tempo para liberar uma tecla. Atraso muito grande faz com que você espere uma repetição automática. Não é o suficiente para você se aborrecer, mas o suficiente para retardar a transferência de seus pensamentos da cabeça para o computador. Quanto maior a frequência de repetição automática, mais rápido o texto está sendo apagado e mais difícil é interromper esse processo. O objetivo é encontrar um valor ótimo.


Então, o comando mágico é:


 $ xset r rate 190 20 

190 - duração do atraso em milissegundos,
20 - frequência em repetições por segundo.


Eu recomendo começar com esses valores e aumentar o atraso pouco a pouco até falsos positivos, depois retornar um pouco. Se o atraso for muito pequeno, você não poderá usar o teclado. Para corrigir isso, um servidor X ou um computador completo deve ser reiniciado. Então, por favor, tenha cuidado.


Para salvar os parâmetros, você precisa adicionar este comando em algum lugar do X autostart.


Indicação de saída do processo


Muitas vezes, tenho que iniciar alguns processos de longa execução: backup em massa, transferência de big data, empacotamento / extração de arquivos, criação de pacotes e assim por diante. Geralmente inicio esse processo, alterno para outra tarefa e olho ocasionalmente se meu processo de longo prazo terminou. Às vezes eu mergulho muito fundo no trabalho e esqueço. A solução é adicionar uma notificação de saída do processo que me tirará do transe.


Existem muitas ferramentas para esse fim: notificar-enviar, dzen2, bip, aplay, wall. Todos eles são bons de alguma forma, mas não funcionam com a conexão ssh. É por isso que eu uso o bipe do terminal:


 $ long-running-command; echo $'\a' 

A codificação ASCII possui um caractere 0x7, chamado bell . É usado para emitir um bipe no alto-falante do PC. O alto-falante do PC não é algo moderno, nem todo computador o possui e não é ouvido nos fones de ouvido. É por isso que alguns terminais usam a chamada campainha visual. Eu uso o urxvt, e ele executa um sino visual, aumentando a sinalização de urgência. O que é isso? É uma coisa usada quando uma janela quer dizer que é urgente.


Você pode verificar como o seu terminal reage ao caráter da campainha agora:


 $ sleep 3; echo $'\a' 

São dados três segundos para você alternar para outra janela; pode ser necessário.


Infelizmente, nem todo terminal pode exibir campainha visual, levantando a bandeira de urgência. Eu verifiquei o mais popular.


Emulador de terminalsino visual como bandeira de urgência
konsolepode estar ativado nas preferências
urxvtsim
xfce4-terminalpode estar ativado nas preferências
xtermnão
termo retro legalnão
lxterminalnão
gnome-terminalnão

É muito longo para digitar echo $'\a' , então criei um alias de wake .


Aliases


Por comandos padrão, cp , scp e rm funcionam de forma não recursiva e isso é péssimo! É um maldito legado! Bem, pode ser corrigido usando aliases. Mas primeiro vamos ver quando o comportamento não recursivo pode ser útil.


 $ mkdir foodir $ cp * foodir 

Somente arquivos serão copiados para o foodir , mas não para os diretórios. A mesma situação ocorre com rm :


 $ rm * 

excluirá apenas arquivos e links simbólicos, mas manterá os diretórios. Mas com que frequência você precisa desse recurso? Eu gosto de pensar que cp e rm sempre funcionam recursivamente.


Ok, mas e a segurança? Talvez o comportamento não recursivo proteja seus arquivos? Há um caso em que você tem um link simbólico para o diretório e deseja remover esse link simbólico, mas mantenha o diretório. Se uma barra for anexada (intencionalmente ou ocasionalmente) ao nome do diretório e o modo recursivo for ativado via -r , o diretório ficará vazio! VAZIO!


 $ ln -s foodir dir_link $ rm -r dir_link/ 

Sem -r arg, ele abusará e não removerá nada. Portanto, rm recursiva aumenta o risco de perder um pouco os dados.


Ativei o modo recursivo para cp , scp e rm e também adicionei -p para mkdir para criar diretórios aninhados facilmente.


 alias cp='cp -r' alias scp='scp -r' alias rm='rm -r' alias mkdir='mkdir -p' 

Por dois anos, nunca me arrependi desses pseudônimos e nunca perdi dados. Há também uma desvantagem: é possível copiar / remover menos dados do que o necessário e não avistá-los ao trabalhar no sistema sem apelidos. Então, por favor tenha cuidado. Sei o que faço e sempre corro rm com cautela.


Os mais populares são os aliases de ls e você provavelmente já os usa:


 alias ls='ls -F --color=auto' alias la='ls -A' alias ll='ls -lh' alias lla='ll -A' 

Além disso, um grep colorido é muito mais bonito do que incolor:


 alias grep='grep --colour=auto' 

Aliases não funcionam em scripts, não se esqueça disso! Você precisa especificar explicitamente todos os argumentos.


Digitação por toque


É óbvio, mas lembro: a digitação por toque ajuda a digitar mais rapidamente. Vai ser difícil no começo, mas você superará os limites ao longo do tempo.


O melhor momento para aprender a digitar com toque é nas férias, quando ninguém a incomoda. Por favor, não se apresse ao aprender! Seu objetivo é memorizar onde cada personagem está localizado, não tanto com sua mente, mas com seus dedos. É melhor digitar devagar, mas sem erros, em vez de rápido com erros. Lembre-se de que os mestres têm bons resultados, não com dedos rápidos, mas sem cometer erros.


Não se esqueça de fazer uma pausa. Seu cérebro e seus dedos precisam descansar. Quando os erros começam a aparecer, isso significa que você precisa fazer uma pausa.


Isso é tudo por hoje


Espero que essas dicas realmente o ajudem. Boa sorte

Source: https://habr.com/ru/post/pt481940/


All Articles