Executando verificação de segurança...
6
yac
4 min de leitura ·

Como criar atalhos para o terminal

Criar atalhos para o terminal pode ser muito gratificante. As vezes percebemos a necessidade apenas quando nos encontramos repetindo diversas vezes os mesmos comandos.

Talvez a estrutura de pastas e arquivos base de um projeto, criação de ambiente virtual, o processo de instalação de algum programa, instalar dependências, etc. Tudo isso pode ser resumido à apenas um comando. E ainda com a facilidade de ter o auto complete do terminal.

Neste post pretendo explicar como criar esses atalhos e também dar alguns exemplos práticos. Tomarei como base o terminal bash e o sistema operacional Linux (Ubuntu) (No caso do WSL também se aplica normalmente). Mas se você tiver dicas sobre esse terminal e SO ou outros, por favor fique a vontade para compartilhar nos comentários :D

Configurar .bash_aliases e .bashrc

.bashrc

Na raiz (~) do sistema existe um arquivo chamado .bashrc, com configurações para o terminal. O primeiro passo é abrí-lo para garantir que o seguinte bloco de código esteja nele:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Basicamente o que isso faz é verificar se existe um arquivo chamado .bash_aliases e então chamar o que está dentro dele. Caso não encontre esse código lá, basta adicioná-lo.

.bash_aliases

Agora é preciso criar o arquivo .bash_aliases na pasta raiz (touch ~/.bash_aliases). Na verdade não é que precisamos fazer dessa forma. Poderíamos adicionar o que vamos colocar nesse arquivo no próprio .bashrc ao invés daquela condicional, porém, para fins de organização, separamos as coisas.

Feito isso basta colocar os atalhos, ou aliases (apelidos) neste arquivo. Você pode abrí-lo com vim, nano, vscode, etc.

Para criar os aliases basta seguir o modelo abaixo:

alias nome-do-comando="o(s) comando(s) que quero rodar"

Simples, não é? Veja alguns exemplos:

alias dj-run="python manage.py runserver"
alias dj-super="python manage.py createsuperuser"

alias dc-up="docker-compose up"
alias dc-down="docker-compose down"

alias pg-start="sudo service postgresql start"
alias pg-stop="sudo service postgresql stop"

...

A vantagem disso também está em ter o poder do auto-complete do terminal. Assim, mesmo que você crie um comando com nome mais extenso, não haverá problema, se isso ajudar a tornar o alias mais descritivo.

Uma outra vantagem é que você ainda pode concatenar comandos, mesmo usando aliases. Por exemplo, tomando como base o comando dc-up acima, caso eu quisesse rodá-lo com a flag --build, poderia fazer isso sem problema.

Geralmente eu costumo prefixar os comandos de acordo com o o contexto. Acredito que fica mais organizado e fácil de lembrar. Por exemplo, se eu quiser rodar algum comando relacionado à Django, basta digitar dj- e depois apertar Tab duas vezes que vai aparecer todos os comandos que iniciam com dj-.

bash functions

Uma coisa bem interessante, é que também podemos criar aliases com funções. Assim, seria possível criar um alias que recebe argumentos na linha de comando, e muito mais.

Por mais que seja algo bem eficiente, pode acabar sendo um pouco mais complicado por conta de ter que aprender como funciona a sintaxe. Admito que o meu conhecimento nessa questão ainda é limitado. Porém, segue abaixo um exemplo, de um comando que serve para criar uma pasta e já navegar para dentro dela ao mesmo tempo:

function mkcd {
  last=$(eval "echo \$$#")
  if [ ! -n "$last" ]; then
    echo "Enter a directory name"
  elif [ -d $last ]; then
    echo "\`$last' already exists"
  else
    mkdir $@ && cd $last
  fi
}

Esse código foi tirado daqui.

Essa função pode ser colocada no arquivo .bash_aliases normalmente. Basicamente o que ela faz é verificar se foi passado um nome para a criação da pasta e também se outra pasta com aquele nome já existe. Se tudo estiver ok, ele cria a pasta e navega para dentro dela. O nome da função é o nome do comando que deverá ser digitado no terminal. Exemplo:

mkcd minha-nova-pasta

Para falar a verdade, as verificações feitas nessa função servem apenas para retornar mensagens de erro mais amigáveis. Porém, mesmo se você retirar as condicionais, vai funcionar da mesma forma, só que as mensagens de erro serão as mensagens padrão do SO, e por se tratar de uma junção de dois comandos, ele vai mostrar o erro referente apenas ao primeiro comando que der errado.

Acredito que esse exemplo simples já é o suficiente para começarmos a brincar com funções e aprender o básico da sintaxe.

Conclusão

Atalhos para o terminal podem ser muito úteis. Caso você perceba que algo está ficando repetitivo, ou que sempre segue algum padrão, será que seria possível criar algum alias que facilitaria o processo?

Você tem algum alias que usa e gostaria de compartilhar, ou alguma outra dica sobre o assunto? Comente aqui em baixo! :D

Carregando publicação patrocinada...
2

Ahh, ao ler o título eu pensei em acrescentar a possibilidade de fazer uma function, mas seu post já foi completo em relação a isso.

Nesse caso vou acrescentar alguns atalhos e funções que mais uso no dia a dia:

# remove all docker images dangling around
rm-dangling(){
    dangling=$(docker images -f dangling=true -q)
    if [ -z "$dangling" ]
    then
        date +"%Y-%m-%d %H:%M:%S rm-dangling: no zombie containers around"
    else
        date +"%Y-%m-%d %H:%M:%S rm-dangling: some zombie containers around"
        docker rmi $(docker images -f dangling=true -q) --force
    fi
}

# use pipe | to redirect a command output to clipboard
alias c="xclip -selection clipboard"

# list all devices connected to a network
# in this example the network is 192.168.2.0 with 255.255.255.0 mask
alias lsnw="sudo nmap -sP -n 192.168.2.0/24"

# avoid typo error
alias mkae="make"
alias amke="make"
alias maek="make"
alias cd..="cd .."
1

Rapaz, muito bons esses seus alias. Gostei muito dessa rm-dangling, realmente é bem útil, direto tenho que limpar esse tipo de coisa no docker.

Sobre o alias c (use pipe | to redirect a command output to clipboard), curiosamente não funcionou aqui 🤔. Mas sem as flags deu certo.

E meu amigo, já perdi as contas de quantas vezes digitei cd.. ao invés de cd .., muito legal você ter pensado inclusive em evitar esses typos.

2

uma outra forma que você também pode fazer a criar um arquivo do tipo .aliasrc e realizar o source no seu shell favorito.

A vantagem do .aliasrc é que ele independe do bash para rodar

Olha minha lista de aliás por exemplo, eu criei ela no .aliasrc e ela responde ao meu fish e ao meu bash

# System Utils

alias ls="exa --icons --color=always"
alias ll="exa --icons --color=always"
alias la="exa -la --icons --color=always"
alias tree="exa --icons --color=always --tree"
alias cat="bat -p"
alias update="sudo rm /var/lib/apt/lists/lock; sudo rm /var/cache/apt/archives/lock; sudo rm /var/lib/dpkg/lock; sudo dpkg --configure -a; sudo apt update && sudo apt upgrade -y && sudo apt autoclean && sudo apt autoremove && flatpak update && snap refresh"
alias vim="nvim"
alias dosbox-x="flatpak run com.dosbox_x.DOSBox-X"

# I'm a lazy programmer

alias clearfile="cat /dev/null > $1"
alias manage="python3 manage.py"
alias venv-create="python3 -m venv venv && pip freeze > requirements.txt"
alias venv="python3 -m venv venv && source ./venv/bin/activate && pip freeze > requirements.txt"
alias venv-init="source ./venv/bin/activate"
alias django="python3 -m django"
alias serve="adonis serve --dev"
alias compile="g++ -k8 -Wall -Wconversion $1"
alias passgen="cat /dev/urandom | tr -cd '[:print:]' | head -c 32"
alias readalias="bat -p ~/.aliasrc | less"
alias studyingRebuild="git clone https://github.com/xanmod/linux && mv linux xanmodLinux && git clone https://github.com/apple/darwin-xnu && mv darwin-xnu xnu && git clone https://9p.io/sources/plan9/" 
alias lua="luajit"
alias python="pypy"
alias python3="pypy3"
# Games
alias technic="bash /usr/local/bin/UltimMC/UltimMC"
alias mserver="ngrok tcp --region=sa $1"
2

Meu amigo, realmente é uma excelente contribuição esse comentário que você fez. Não sabia que isso era possível.

Uma dúvida, nos seus aliases, o $1 é um placeholder para argumentos na linha de comando?

2

Em bash o $1 trata-se do primeiro argumento enviado para um comando e se pode usar de forma sequencial.
Pode-se usar o $@ para ler todos os argumentos.

1

Hmmm interessante. Então suponho que possa usar também $1, $2, $3, etc... caso eu queira um número específico de argumentos sequenciais. Gostei.

1
1
1

Recursos de autocomplete? 🤔

Você se refere à quanto aparece tipo uma "sombra" mostrando o resto do comando? Já cheguei a ver isso no zsh, mas de outra pessoa, eu mesmo não uso o zsh. Achei bem maneiro e muito prático.

1

Cara, que sensacional. Sempre tem aqueles comandos que uso com muita frequência e com a possibilidade de abreviá-los vai ficar muito fácil.

Testei no ZSH e funcionou do mesmo jeito, add no .zshrc. Acredito que vai funcionar para outros shell’s também.