Post

Estação de Trabalho como Código (Parte 2): Customizando o Bash com Aliases e Funções

Aprenda a customizar seu ambiente Bash criando aliases para comandos comuns, otimizando seu histórico e configurando um prompt de comando mais informativo. Esta segunda parte da série foca em tornar sua linha de comando mais produtiva e agradável.

Estação de Trabalho como Código (Parte 2): Customizando o Bash com Aliases e Funções

Tutorial Anterior: Estação de Trabalho como Código (Parte 1): Fundação com Ubuntu 24.04 e Git

Introdução

Na primeira parte, estabelecemos a fundação da nossa estação de trabalho, atualizando o sistema e iniciando o versionamento com Git. Agora, é hora de mergulhar na personalização do nosso ambiente de linha de comando. Passamos a maior parte do nosso tempo no terminal, e pequenas otimizações aqui podem resultar em grandes ganhos de produtividade e conforto.

Neste tutorial, vamos focar no coração do nosso shell: o Bash. Vamos criar arquivos de configuração dedicados para organizar nossas customizações, definir aliases que economizam tempo, otimizar o histórico de comandos e configurar um prompt (PS1) que seja tanto informativo quanto visualmente agradável.

Objetivos desta Parte

  • Entender o conceito de dotfiles e sua importância
  • Criar arquivos de configuração dedicados para aliases e funções Bash
  • Configurar o histórico de comandos para ser mais útil e persistente
  • Definir um prompt de comando (PS1) customizado e informativo
  • Criar uma coleção de aliases para comandos comuns utilizando ferramentas modernas
  • Integrar fzf para buscas inteligentes no histórico e em arquivos
  • Validar que todas as configurações foram aplicadas corretamente

Pré-requisitos

  • Conclusão da Parte 1 desta série
  • O repositório workspace-as-code deve existir no seu diretório home
  • Familiaridade básica com Bash e terminal Linux

A quem se destina

Este tutorial é ideal para:

  • SysAdmins: Que querem otimizar seu fluxo de trabalho no terminal
  • DevOps Engineers: Que desejam um ambiente shell mais eficiente e produtivo
  • Desenvolvedores: Interessados em melhorar produtividade e velocidade de trabalho
  • Profissionais de TI: Que passam muito tempo no terminal e querem maximizar eficiência

Pré-conhecimento: Familiaridade básica com Bash e terminal Linux é recomendada. Se você completou a Parte 1, você tem o conhecimento necessário.

Tempo Estimado

40-50 minutos

Isso inclui:

  • Leitura e compreensão: ~10 min
  • Criação de arquivos: ~5 min
  • Adição de conteúdo: ~10 min
  • Teste dos aliases: ~10 min
  • Customização pessoal: ~5-15 min

Dica Útil: Se você quiser apenas copiar e colar, pode fazer em 20 minutos. Mas recomendamos ler e entender cada seção para aproveitar ao máximo.


Verificando Pré-Requisitos

Antes de começar, certifique-se de que completou a Parte 1 corretamente:

Verificando o Repositório

1
2
3
4
5
6
7
8
9
10
11
# Verifique se o repositório existe
$ ls -la ~/workspace-as-code/

# Você deve ver:
# drwxr-xr-x  ansible/
# drwxr-xr-x  dotfiles/
# drwxr-xr-x  packer/
# drwxr-xr-x  scripts/
# drwxr-xr-x  terraform/
# -rw-r--r--  .gitignore
# drwxr-xr-x  .git/

Verificando as Ferramentas Instaladas

1
2
3
4
5
6
7
8
9
# Verifique se as ferramentas estão disponíveis
$ which fzf eza bat ripgrep grc

# Todas devem retornar um caminho como:
# /usr/bin/fzf
# /usr/bin/eza
# /usr/bin/bat
# /usr/bin/rg
# /usr/bin/grc

Se alguma ferramenta não for encontrada, volte à Parte 1 e instale-a.


O que são Dotfiles?

Dotfiles são arquivos de configuração em sistemas Unix/Linux que começam com um ponto (.). Eles são ocultos por padrão (use ls -la para vê-los) e contêm configurações para programas como shell, editor, git, etc.

Exemplos Comuns de Dotfiles

ArquivoPropósito
.bashrcConfigurações do Bash (executado em cada novo terminal)
.bash_aliasesAliases do Bash
.bash_customCustomizações personalizadas e variáveis
.vimrcConfigurações do Vim
.tmux.confConfigurações do Tmux
.gitconfigConfigurações do Git
.ssh/configConfigurações do SSH

Por que Versionamos Dotfiles?

Ao versionarmos nossos dotfiles no Git, conseguimos:

  • Reproduzir nosso ambiente em qualquer máquina
  • Rastrear mudanças ao longo do tempo
  • Compartilhar configurações com a equipe
  • Manter backup seguro de nossas preferências
  • Reverter mudanças se algo der errado

Vamos criar esses arquivos em ~/workspace-as-code/dotfiles/ e depois criar links simbólicos para o home directory.


Preparando os Arquivos de Configuração

Antes de adicionar conteúdo, precisamos criar os arquivos onde armazenaremos nossas configurações.

Criando os Arquivos

1
2
3
4
5
6
7
8
9
10
11
12
# Navegue até o diretório de dotfiles
$ cd ~/workspace-as-code/dotfiles

# Crie os arquivos vazios
$ touch .bash_custom .bash_aliases

# Verifique se foram criados
$ ls -la

# Você deve ver:
# -rw-r--r-- .bash_custom
# -rw-r--r-- .bash_aliases

Editando os Arquivos

Você pode editar os arquivos de várias formas:

Opção 1: Usando Vim (recomendado, será coberto na Parte 3)

1
$ vim ~/workspace-as-code/dotfiles/.bash_custom

Opção 2: Usando Nano (mais fácil para iniciantes)

1
$ nano ~/workspace-as-code/dotfiles/.bash_custom

Opção 3: Usando cat com redirecionamento (recomendado para este tutorial)

1
2
3
$ cat > ~/workspace-as-code/dotfiles/.bash_custom << 'EOF'
# [Copie o conteúdo do arquivo aqui]
EOF

Para este tutorial, usaremos a Opção 3 (cat com redirecionamento) para garantir que funcione em qualquer ambiente.


Configuração Inicial do Bash

Para manter nossas customizações organizadas, vamos separá-las em arquivos específicos dentro do nosso diretório dotfiles. O ~/.bashrc principal irá apenas carregar esses arquivos.

Entendendo o ~/.bashrc

O arquivo ~/.bashrc é o arquivo de configuração principal do Bash. Ele é executado toda vez que você abre um novo terminal interativo.

Estrutura Típica do ~/.bashrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ~/.bashrc

# Se não for shell interativo, saia
[ -z "$PS1" ] && return

# Carregue as configurações customizadas
if [ -f ~/.bash_custom ]; then
    source ~/.bash_custom
fi

# Carregue os aliases
if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi

Configurações Personalizadas (.bash_custom)

Este arquivo conterá configurações de ambiente, variáveis de exportação, e a configuração de ferramentas como fzf e o histórico.

Crie o arquivo com o seguinte conteúdo:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# Copie este conteúdo para ~/workspace-as-code/dotfiles/.bash_custom
$ cat > ~/workspace-as-code/dotfiles/.bash_custom << 'EOF'
#!/bin/bash
################################################################################
# .bash_custom
#
# Arquivo de configurações personalizadas para Bash
# Inclui: FZF, Histórico, Editor, SSH Agent, Variáveis de Ambiente
#
# Uso: Adicione ao final do ~/.bashrc:
#   if [ -f ~/.bash_custom ]; then
#       source ~/.bash_custom
#   fi
#
# Autor: Workspace as Code
# Data: 2026-02-21
################################################################################

# ============================================================================
# FZF - FUZZY FINDER CONFIGURATION
# ============================================================================

# Carregar key-bindings do fzf
if command -v fzf &>/dev/null; then
    if [ -f /usr/share/doc/fzf/examples/key-bindings.bash ]; then
        source /usr/share/doc/fzf/examples/key-bindings.bash
    elif [ -f ~/.fzf.bash ]; then
        source ~/.fzf.bash
    else
        FZF_DIR=$(find /usr -name "key-bindings.bash" 2>/dev/null | head -1)
        [ -f "$FZF_DIR" ] && source "$FZF_DIR"
    fi
else
    echo "Aviso: fzf não está instalado. Instale com: sudo apt install fzf"
fi

# ============================================================================
# FZF - CONFIGURAÇÕES AVANÇADAS (com fd e bat)
# ============================================================================

# Usar fd para listar arquivos (mais rápido que find)
if command -v fd &>/dev/null; then
    export FZF_DEFAULT_COMMAND='fd --type f --hidden --no-ignore'
    export FZF_ALT_C_COMMAND='fd --type d --hidden --no-ignore'
    export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi

# Usar bat para preview (com cores e números de linha)
if command -v bat &>/dev/null; then
    export FZF_CTRL_T_OPTS="--preview 'bat --color=always --style=numbers,changes {} 2>/dev/null || head -n 50 {}'"
    export FZF_ALT_C_OPTS="--preview 'tree -C {} 2>/dev/null | head -n 50 || eza --tree {} | head -n 50'"
fi

# Tema FZF personalizado (cores modernas)
export FZF_DEFAULT_OPTS="
    --color=fg:#cdd6f4,bg:#1e1e2e,hl:#f38ba8
    --color=fg+:#cdd6f4,bg+:#313244,hl+:#f38ba8
    --color=info:#94e2d5,prompt:#f5c2de,pointer:#f38ba8
    --color=marker:#f5c2de,spinner:#f5c2de,header:#94e2d5
    --multi
    --bind 'ctrl-v:execute(vim {})+abort'
    --bind 'ctrl-y:execute-silent(echo {} | xclip -selection clipboard)+abort'
"

# ============================================================================
# HISTÓRICO - CONFIGURAÇÕES AVANÇADAS
# ============================================================================

# Tamanho do histórico
export HISTSIZE=10000
export HISTFILESIZE=20000

# Controle de duplicatas e comandos ignorados
export HISTCONTROL="ignoreboth:erasedups"
export HISTIGNORE="ls:cd:exit:clear:history:pwd:date:uptime:whoami"

# Formato de timestamp no histórico
export HISTTIMEFORMAT="%d/%m/%Y %T "

# Adicionar comandos ao histórico imediatamente
shopt -s histappend
shopt -s cmdhist

# Salvar histórico multi-linha
shopt -s lithist

# ============================================================================
# EDITOR PADRÃO
# ============================================================================

export EDITOR=vim
export VISUAL=vim
export PAGER=less

# ============================================================================
# PROMPT DE COMANDO PERSONALIZADO (PS1)
# ============================================================================

# PS1 Minimalista (padrão)
# Mostra apenas o caminho e o prompt
export PS1="\[\e[38;5;81m\]\w\[\e[0m\] \[\e[38;5;204m\]\$\[\e[0m\] "

# PS1 Informativo (comentado)
# Mostra usuário, host, caminho e status do último comando
# export PS1="\[\e[38;2;161;80;161m\]\u\[\e[0m\]@\[\e[38;2;121;212;133m\]\h\[\e[0m\][\[\e[38;2;0;172;201m\]\w\[\e[0m\]]\[\e[38;2;204;174;135m\]\$ \[\e[0m\] "

# PS1 com Status do Git (comentado - requer git-prompt.sh)
# export PS1="\[\e[38;5;81m\]\w\[\e[0m\]\$(__git_ps1 ' (%s)')\[\e[38;5;204m\] \$ \[\e[0m\]"

# PS1 com Indicador de Erro (comentado)
# export PS1="\[\e[38;5;81m\]\w\[\e[0m\] \[\e[38;5;\$([[ \$? == 0 ]] && echo 82 || echo 196)m\]\$\[\e[0m\] "

# ============================================================================
# SSH AGENT - CONFIGURAÇÃO AUTOMÁTICA
# ============================================================================

SSH_AGENT_FILE=~/.ssh/ssh-agent.env

# Função para iniciar SSH Agent
ssh_agent_start() {
    ssh-agent | grep -v '^echo' > "$SSH_AGENT_FILE"
    chmod 600 "$SSH_AGENT_FILE"
    source "$SSH_AGENT_FILE" > /dev/null
    echo "SSH Agent iniciado"
}

# Inicializar SSH Agent se não estiver rodando
if [ -z "$SSH_AUTH_SOCK" ]; then
    if [ -f "$SSH_AGENT_FILE" ]; then
        source "$SSH_AGENT_FILE" > /dev/null
    fi
    
    # Verifica se o agente ainda está rodando
    if ! ps -p "$SSH_AGENT_PID" > /dev/null 2>&1; then
        ssh_agent_start
    fi
fi

# Adicionar chaves SSH automaticamente
# Personalizar com suas chaves
if [ -f ~/.ssh/id_rsa ] && ! ssh-add -l | grep -q "id_rsa"; then
    ssh-add ~/.ssh/id_rsa 2>/dev/null
fi

if [ -f ~/.ssh/trabalho ] && ! ssh-add -l | grep -q "trabalho"; then
    ssh-add ~/.ssh/trabalho 2>/dev/null
fi

if [ -f ~/.ssh/github ] && ! ssh-add -l | grep -q "github"; then
    ssh-add ~/.ssh/github 2>/dev/null
fi

# ============================================================================
# VARIÁVEIS DE AMBIENTE - APLICAÇÕES
# ============================================================================

# EZA - Configurações
if command -v eza &>/dev/null; then
    export EZA_STANDARD_OPTIONS="--group-directories-first --icons --color=auto"
fi

# BAT - Configurações
if command -v bat &>/dev/null; then
    export BAT_THEME="OneHalfDark"
    export BAT_STYLE="numbers,changes"
fi

# RIPGREP - Configurações
if command -v rg &>/dev/null; then
    export RIPGREP_CONFIG_PATH=~/.ripgreprc
fi

# ============================================================================
# VARIÁVEIS DE AMBIENTE - DESENVOLVIMENTO
# ============================================================================

# Node.js
export NODE_ENV=development

# Python
export PYTHONUNBUFFERED=1

# Go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

# Rust
export PATH=$PATH:$HOME/.cargo/bin

# ============================================================================
# VARIÁVEIS DE AMBIENTE - WORKSPACE
# ============================================================================

# Workspace as Code
export WORKSPACE_HOME="$HOME/workspace-as-code"
export WORKSPACE_SCRIPTS="$WORKSPACE_HOME/scripts"
export WORKSPACE_DOTFILES="$WORKSPACE_HOME/dotfiles"

# Adicionar scripts ao PATH
if [ -d "$WORKSPACE_SCRIPTS" ]; then
    export PATH="$WORKSPACE_SCRIPTS:$PATH"
fi

# ============================================================================
# OPÇÕES DE SHELL - SHOPT
# ============================================================================

# Permitir ** para busca recursiva
shopt -s globstar

# Corrigir pequenos erros em cd
shopt -s cdspell

# Verificar tamanho da janela após cada comando
shopt -s checkwinsize

# ============================================================================
# FIM DO ARQUIVO .bash_custom
# ============================================================================
EOF

Entendendo o Prompt Customizado (PS1)

O prompt é a linha que aparece antes de você digitar um comando. Você pode customizá-lo para mostrar informações úteis.

Componentes do PS1

1
export PS1="\[\e[38;5;81m\]\w\[\e[0m\] \[\e[38;5;204m\]\$\[\e[0m\] "
ComponenteSignificado
\[ e \]Marcadores para caracteres não-imprimíveis (cores)
\e[38;5;81mCódigo de cor (azul)
\wDiretório atual (working directory)
\e[0mReset de cor (volta ao padrão)
\$Símbolo $ (ou # se root)

Testando Diferentes Prompts

1
2
3
4
5
6
7
8
9
10
11
# Prompt simples
$ export PS1="\w $ "

# Prompt com hora
$ export PS1="\[\e[32m\]\t\[\e[0m\] \w $ "

# Prompt com usuário e host
$ export PS1="\u@\h:\w$ "

# Prompt com status do último comando
$ export PS1="\[\e[32m\]\$?\[\e[0m\] \w $ "

Para tornar permanente, adicione ao .bash_custom.


Criando Atalhos com Aliases

Aliases são atalhos para comandos mais longos. Eles são uma das maneiras mais eficazes de acelerar seu fluxo de trabalho no terminal.

Ferramentas Modernas vs Tradicionais

Neste tutorial, estamos substituindo ferramentas tradicionais por alternativas modernas:

TarefaFerramenta TradicionalFerramenta ModernaVantagem
Listar arquivoslsezaCores, ícones, git status
Visualizar arquivocatbatRealce de sintaxe, números de linha
Buscar em arquivosgrepripgrepMuito mais rápido, ignora .gitignore
Buscar interativohistoryfzfInterface intuitiva, preview
Colorir outputNenhumgrcCores para ping, traceroute, etc

Você ainda pode usar as ferramentas tradicionais quando necessário!

Criando o Arquivo de Aliases

Abra o arquivo ~/workspace-as-code/dotfiles/.bash_aliases e adicione o seguinte conteúdo:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# Copie este conteúdo para ~/workspace-as-code/dotfiles/.bash_aliases
$ cat > ~/workspace-as-code/dotfiles/.bash_aliases << 'EOF'
#!/bin/bash
################################################################################
# .bash_aliases
#
# Arquivo de aliases personalizados para Bash
# Organizado por categoria para facilitar manutenção
#
# Uso: Adicione ao final do ~/.bashrc:
#   if [ -f ~/.bash_aliases ]; then
#       source ~/.bash_aliases
#   fi
#
# Autor: Workspace as Code
# Data: 2026-02-21
################################################################################

# ============================================================================
# ALIASES DE FUNÇÕES DO .bash_functions
# ============================================================================

# Atalhos para funções de busca
alias ss='smart_search'
alias fe='fdedit'
alias re='rgedit'
alias po='plocate_open'
alias fo='fopen'

# Atalhos para funções de arquivo
alias bk='backup'
alias bkd='backup_dir'
alias dl='download_file'
alias sb='sync_backup'

# Atalhos para funções de sistema
alias sys='system_info'
alias help='cmd_help'
alias vl='view_lines'

# Atalhos para funções de desenvolvimento
alias ear='edit_and_run'
alias fh='fhistory'

# Atalhos para funções de produtividade
alias mkcd='mkcd'
alias cgr='cd_git_root'
alias ext='extract'
alias cmp='compress'

# ============================================================================
# ALIASES DE REDE (coloridos com grc)
# ============================================================================

if command -v grc &>/dev/null; then
    alias tail='grc tail'
    alias ping='grc ping'
    alias ping3='grc ping -c3'
    alias ping5='grc ping -c5'
    alias ps='grc ps'
    alias traceroute='grc traceroute'
    alias dig='grc dig'
    alias ss='grc ss'
    alias netstat='grc netstat'
    alias ifconfig='grc ifconfig'
fi

# ============================================================================
# ALIASES PARA CURL E WGET
# ============================================================================

# Curl com headers JSON
alias curl_json='curl -H "Content-Type: application/json"'
alias curl_post='curl -X POST'
alias curl_get='curl -X GET'
alias curl_put='curl -X PUT'
alias curl_delete='curl -X DELETE'
alias curl_auth='curl -H "Authorization: Bearer"'
alias curl_verbose='curl -v'

# Wget com continuação de download
alias wget='wget -c'
alias wget_bg='wget -b'
alias wget_mirror='wget -m'

# ============================================================================
# ALIASES PARA GREP E RIPGREP
# ============================================================================

if command -v rg &>/dev/null; then
    alias grep='rg --smart-case'
    alias rg='rg --smart-case'
    alias rg_py='rg -g "*.py"'
    alias rg_js='rg -g "*.js"'
    alias rg_json='rg -g "*.json"'
    alias rg_yaml='rg -g "*.yaml" -g "*.yml"'
    alias rg_sh='rg -g "*.sh"'
else
    alias grep='grep --color=auto'
fi

# ============================================================================
# ALIASES DE VISUALIZAÇÃO E SISTEMA
# ============================================================================

# Informações de disco e memória
alias df='df -hT'
alias du='du -h --max-depth=1'
alias free='free -h'
alias top='btop'
alias monitor='btop'

# Informações de sistema
alias uname='uname -a'
alias uptime='uptime'
alias whoami='whoami'
alias hostname='hostname'

# ============================================================================
# ALIASES EZA (Substituto moderno para ls)
# ============================================================================

if command -v eza &>/dev/null; then
    # Aliases básicos
    alias ls='eza $EZA_STANDARD_OPTIONS'
    alias l="eza --long $EZA_STANDARD_OPTIONS"
    alias ll='eza --long --header --git $EZA_STANDARD_OPTIONS'
    alias la='eza --long --all --header --git $EZA_STANDARD_OPTIONS'
    
    # Aliases especializados
    alias lh='eza --long --all --header --git --no-permissions --no-user --no-time $EZA_STANDARD_OPTIONS'
    alias lg='eza --grid $EZA_STANDARD_OPTIONS'
    alias lr='eza --long --sort=size --reverse $EZA_STANDARD_OPTIONS'
    alias lt='eza --long --sort=modified --reverse $EZA_STANDARD_OPTIONS'
    alias lx='eza --long --sort=extension $EZA_STANDARD_OPTIONS'
    alias li='eza --long --inode $EZA_STANDARD_OPTIONS'
    alias ld='eza --long --only-dirs $EZA_STANDARD_OPTIONS'
    alias lm='eza --long --sort=modified $EZA_STANDARD_OPTIONS'
    
    # Aliases de árvore
    alias tree='eza --tree --level=2 $EZA_STANDARD_OPTIONS'
    alias tree1='eza --tree --level=1 $EZA_STANDARD_OPTIONS'
    alias tree3='eza --tree --level=3 $EZA_STANDARD_OPTIONS'
    alias tree_all='eza --tree $EZA_STANDARD_OPTIONS'
else
    # Fallback para ls normal se eza não estiver instalado
    alias ls='ls --color=auto --group-directories-first'
    alias ll='ls -alFh --group-directories-first'
    alias la='ls -A --group-directories-first'
    alias l='ls -lh --group-directories-first'
fi

# ============================================================================
# ALIASES BAT (Substituto moderno para cat)
# ============================================================================

if command -v bat &>/dev/null; then
    alias cat='bat --paging=never --theme="OneHalfDark"'
    alias b='bat --paging=never'
    alias bat_theme='bat --list-themes'
    alias bat_lang='bat --list-languages'
else
    # Fallback para cat normal
    alias cat='cat'
fi

# ============================================================================
# ALIASES FD (Substituto moderno para find)
# ============================================================================

if command -v fd &>/dev/null; then
    alias fde='fd -e'
    alias fdd='fd --type d'
    alias fdf='fd --type f'
    alias fdh='fd --hidden'
    alias fdx='fd --type x'
fi

# ============================================================================
# ALIASES VIM
# ============================================================================

alias v='vim'
alias vi='vim'
alias view='vim -R'

# ============================================================================
# ALIASES TMUX
# ============================================================================

alias t='tmux'
alias tn='tmux new-session -s'
alias ta='tmux attach-session -t'
alias tl='tmux list-sessions'
alias tk='tmux kill-session -t'
alias tka='tmux kill-server'
alias ts='tmux send-keys -t'

# ============================================================================
# ALIASES GIT
# ============================================================================

alias g='git'
alias ga='git add'
alias gaa='git add -A'
alias gap='git add -p'
alias gb='git branch'
alias gba='git branch -a'
alias gbd='git branch -d'
alias gc='git commit'
alias gcm='git commit -m'
alias gca='git commit --amend'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gd='git diff'
alias gds='git diff --staged'
alias gf='git fetch'
alias gl='git log --oneline'
alias glg='git log --graph --oneline --all'
alias gp='git push'
alias gpu='git push -u origin'
alias gpl='git pull'
alias gr='git rebase'
alias gri='git rebase -i'
alias grm='git reset --mixed'
alias grs='git reset --soft'
alias grh='git reset --hard'
alias gs='git status'
alias gst='git stash'
alias gsta='git stash apply'
alias gstl='git stash list'
alias gstp='git stash pop'
alias gt='git tag'

# ============================================================================
# ALIASES DE PRODUTIVIDADE
# ============================================================================

# Navegação rápida
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cd..='cd ..'
alias cd...='cd ../..'
alias cd....='cd ../../..'
alias back='cd -'
alias home='cd ~'

# Operações de arquivo
alias mkdir='mkdir -pv'
alias rm='rm -i'
alias cp='cp -iv'
alias mv='mv -iv'
alias ln='ln -iv'

# Operações de diretório
alias pwd='pwd -P'
alias dirs='dirs -v'

# ============================================================================
# ALIASES PARA JQ (Processador JSON)
# ============================================================================

if command -v jq &>/dev/null; then
    alias jq_format='jq "."'
    alias jq_keys='jq "keys"'
    alias jq_values='jq "values"'
    alias jq_length='jq "length"'
    alias jq_type='jq "type"'
fi

# ============================================================================
# ALIASES PARA RSYNC E BACKUP
# ============================================================================

alias rsync_safe='rsync -avz --progress'
alias rsync_delete='rsync -avz --delete --progress'
alias rsync_dry='rsync -avz --dry-run --progress'

# ============================================================================
# ALIASES DE ATUALIZAÇÃO E LIMPEZA
# ============================================================================

alias update='sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt autoclean'
alias upgrade='sudo apt upgrade -y'
alias autoremove='sudo apt autoremove -y'
alias autoclean='sudo apt autoclean'
alias clean='sudo apt clean'

# ============================================================================
# ALIASES DE INFORMAÇÃO
# ============================================================================

alias ipinfo='curl -s http://ipinfo.io/ip'
alias myip='curl -s http://ipinfo.io/ip'
alias publicip='curl -s http://ipinfo.io/ip'
alias localip="hostname -I"
alias ports='netstat -tuln'
alias listening='lsof -i -P -n'

# ============================================================================
# ALIASES DIVERSOS
# ============================================================================

# Editor padrão
alias edit='$EDITOR'
alias nano='nano'

# Compressão
alias tar_gz='tar -czf'
alias tar_bz2='tar -cjf'
alias tar_xz='tar -cJf'
alias untar='tar -xf'

# Permissões
alias chmod_read='chmod 644'
alias chmod_exec='chmod 755'
alias chmod_private='chmod 600'

# Busca rápida
alias path='echo $PATH | tr ":" "\n"'
alias which_all='which -a'

# ============================================================================
# FIM DO ARQUIVO .bash_aliases
# ============================================================================
EOF

Dica Útil: Os blocos if command -v ... garantem que os aliases só serão criados se a ferramenta correspondente estiver instalada, tornando suas configurações portáteis e à prova de falhas.


Ativando as Novas Configurações

Para que o Bash reconheça nossos novos arquivos, precisamos referenciá-los no ~/.bashrc.

Adicionando Nossas Configurações ao ~/.bashrc

Você pode fazer isso de duas formas:

Opção 1: Manualmente (mais seguro)

1
2
3
4
5
6
7
8
# Abra o ~/.bashrc em um editor
$ vim ~/.bashrc

# Adicione ao final do arquivo:
# source ~/workspace-as-code/dotfiles/.bash_custom
# source ~/workspace-as-code/dotfiles/.bash_aliases

# Salve e saia

Opção 2: Usando echo (mais rápido)

1
2
3
4
5
6
# Adicione as linhas ao final do ~/.bashrc
$ echo "source ~/workspace-as-code/dotfiles/.bash_custom" >> ~/.bashrc
$ echo "source ~/workspace-as-code/dotfiles/.bash_aliases" >> ~/.bashrc

# Verifique se foi adicionado
$ tail -5 ~/.bashrc

Carregando as Configurações

Após adicionar as linhas ao ~/.bashrc, você pode carregá-las de duas formas:

Opção 1: Abrir um novo terminal (mais limpo)

1
2
# Feche o terminal atual e abra um novo
# As configurações serão carregadas automaticamente

Opção 2: Usar source (imediato)

1
2
3
4
5
6
# Carregue as configurações na sessão atual
$ source ~/.bashrc

# Ou carregue apenas os arquivos específicos
$ source ~/workspace-as-code/dotfiles/.bash_custom
$ source ~/workspace-as-code/dotfiles/.bash_aliases

Testando os Aliases

Após ativar as configurações, teste cada alias para verificar se está funcionando:

Aliases de Listagem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Listar com eza (cores e ícones)
$ ls

# Você deve ver algo como:
# ansible/  dotfiles/  packer/  scripts/  terraform/  .gitignore

# Listar com detalhes
$ ll

# Listar tudo incluindo ocultos
$ la

# Mostrar estrutura em árvore
$ tree

Aliases de Visualização

1
2
3
4
# Usar cat com realce de sintaxe
$ cat ~/.bashrc

# Você deve ver o arquivo com cores e números de linha

Aliases de Rede

1
2
3
4
5
6
7
8
9
10
# Ping com cores
$ ping -c 3 google.com

# Você deve ver a saída com cores

# Traceroute com cores
$ traceroute google.com

# Dig com cores
$ dig google.com

Aliases Úteis

1
2
3
4
5
6
7
8
9
10
# Obter seu IP público
$ ipinfo

# Você deve ver algo como:
# 203.0.113.42

# Atualizar sistema
$ update

# Isso executará apt update, upgrade, autoremove e autoclean

Você deve ver cores, ícones e formatação melhorada em todos os casos!


Usando FZF para Buscas Inteligentes

O FZF foi configurado com atalhos de teclado. Teste-os:

Atalhos do FZF

AtalhoFunçãoDescrição
Ctrl+RBuscar históricoBusca interativa no histórico de comandos
Ctrl+TSelecionar arquivoBusca e seleciona um arquivo
Alt+CNavegar diretórioBusca e muda para um diretório

Exemplos de Uso

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Pressione Ctrl+R para buscar no histórico
$ Ctrl+R
# Digite parte de um comando anterior
# Use as setas para navegar
# Pressione Enter para executar

# Pressione Ctrl+T para selecionar um arquivo
$ vim Ctrl+T
# Selecione um arquivo com as setas
# Pressione Enter para abrir no vim

# Pressione Alt+C para navegar entre diretórios
$ Alt+C
# Selecione um diretório
# Pressione Enter para mudar para ele

Troubleshooting

Se você encontrar problemas, aqui estão as soluções para os erros mais comuns:

Aliases não funcionam após fazer source

Problema: Você executou source mas os aliases não funcionam.

Solução:

1
2
3
4
5
6
7
8
9
# Verifique se o arquivo foi carregado
$ grep "bash_aliases" ~/.bashrc

# Se não estiver, adicione manualmente:
$ echo "source ~/workspace-as-code/dotfiles/.bash_aliases" >> ~/.bashrc
$ source ~/.bashrc

# Verifique se o alias foi criado
$ alias ls

Prompt não aparece com cores

Problema: O prompt não mostra as cores esperadas.

Solução:

1
2
3
4
5
6
7
# Verifique se seu terminal suporta cores
$ echo $TERM

# Deve ser algo como 'xterm-256color'
# Se não for, adicione ao .bash_custom:
$ export TERM=xterm-256color
$ source ~/.bash_custom

FZF não funciona

Problema: Ctrl+R ou Ctrl+T não abre o fzf.

Solução:

1
2
3
4
5
6
7
8
9
10
11
12
# Verifique se fzf está instalado
$ which fzf

# Se não estiver, instale:
$ sudo apt install fzf

# Verifique se o arquivo de key-bindings existe
$ ls /usr/share/doc/fzf/examples/key-bindings.bash

# Se não existir, instale o pacote completo:
$ sudo apt install fzf
$ source ~/.bash_custom

Eza mostra caracteres estranhos

Problema: Eza mostra ? em vez de ícones.

Solução:

1
2
3
4
5
6
7
# Isso geralmente significa que sua fonte não suporta ícones.
# Use uma fonte que suporte Nerd Fonts (será coberto na Parte 5)

# Por enquanto, você pode desabilitar ícones:
$ alias ls='eza --group-directories-first --color=auto'

# Ou edite o .bash_aliases e remova --icons

Comando “command not found” para ferramentas instaladas

Problema: Você instalou uma ferramenta, mas o Bash não a encontra.

Solução:

1
2
3
4
# Recarregue o hash do shell
$ hash -r

# Ou abra um novo terminal

Validando Sua Configuração

Crie um script para validar que tudo está funcionando corretamente:

Script de Validação

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Crie o script
$ cat > ~/workspace-as-code/scripts/validate-bash.sh << 'EOF'
#!/bin/bash
# Script para validar configuração do Bash

echo "=========================================="
echo "  Validando Configuracao do Bash"
echo "=========================================="
echo ""

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

PASSED=0
FAILED=0

check() {
    if eval "$1" &> /dev/null; then
        echo -e "${GREEN}[OK]${NC} $2"
        ((PASSED++))
    else
        echo -e "${RED}[FAIL]${NC} $2"
        ((FAILED++))
    fi
}

# Verificar arquivos
check "[ -f ~/workspace-as-code/dotfiles/.bash_custom ]" "Arquivo .bash_custom existe"
check "[ -f ~/workspace-as-code/dotfiles/.bash_aliases ]" "Arquivo .bash_aliases existe"

# Verificar se estão carregados
check "grep -q 'bash_custom' ~/.bashrc" ".bash_custom esta carregado no .bashrc"
check "grep -q 'bash_aliases' ~/.bashrc" ".bash_aliases esta carregado no .bashrc"

# Verificar aliases
check "alias | grep -q 'ls='" "Alias 'ls' esta definido"
check "alias | grep -q 'll='" "Alias 'll' esta definido"
check "alias | grep -q 'la='" "Alias 'la' esta definido"

# Verificar ferramentas
check "command -v fzf" "FZF instalado"
check "command -v eza" "EZA instalado"
check "command -v bat" "BAT instalado"
check "command -v rg" "RIPGREP instalado"

# Verificar variáveis de ambiente
check "[ ! -z \$HISTSIZE ]" "HISTSIZE configurado"
check "[ ! -z \$EDITOR ]" "EDITOR configurado"
check "[ ! -z \$PS1 ]" "PS1 configurado"

echo ""
echo "=========================================="
echo -e "Resultado: ${GREEN}$PASSED passou${NC}, ${RED}$FAILED falhou${NC}"
echo "=========================================="

if [ $FAILED -eq 0 ]; then
    echo "Tudo esta configurado corretamente!"
    exit 0
else
    echo "Alguns itens falharam. Revise os passos acima."
    exit 1
fi
EOF

# Dê permissão de execução
$ chmod +x ~/workspace-as-code/scripts/validate-bash.sh

# Execute o script
$ ~/workspace-as-code/scripts/validate-bash.sh

# Você deve ver algo como:
# ==========================================
#   Validando Configuracao do Bash
# ==========================================
#
# [OK] Arquivo .bash_custom existe
# [OK] Arquivo .bash_aliases existe
# [OK] .bash_custom esta carregado no .bashrc
# [OK] .bash_aliases esta carregado no .bashrc
# [OK] Alias 'ls' esta definido
# ...
# ==========================================
# Resultado: 13 passou, 0 falhou
# ==========================================
# Tudo esta configurado corretamente!

Conclusão

Você transformou seu shell Bash em uma ferramenta poderosa e eficiente. Com aliases inteligentes, histórico aprimorado e integração com ferramentas modernas, você economizará tempo e melhorará sua produtividade.

O Que Você Alcançou

✓ Entendimento de dotfiles e sua importância ✓ Configurações de Bash organizadas em arquivos dedicados ✓ Aliases para comandos comuns ✓ Histórico de comandos otimizado ✓ Prompt customizado e informativo ✓ Integração com ferramentas modernas (fzf, eza, bat, ripgrep) ✓ Script de validação para verificar configurações

Próximos Passos Imediatos

  1. Teste todos os aliases:
    1
    2
    3
    4
    5
    
    $ source ~/.bashrc
    $ ls
    $ ll
    $ tree
    $ ping -c 2 google.com
    
  2. Customize o prompt conforme desejar:
    1
    2
    
    # Edite o PS1 no .bash_custom para seu gosto
    $ vim ~/workspace-as-code/dotfiles/.bash_custom
    
  3. Explore as ferramentas FZF:
    1
    2
    3
    4
    5
    6
    7
    8
    
    # Use Ctrl+R para buscar no histórico
    $ Ctrl+R
    
    # Use Ctrl+T para selecionar arquivo
    $ vim Ctrl+T
    
    # Use Alt+C para navegar entre diretórios
    $ Alt+C
    
  4. Commit suas mudanças:
    1
    2
    3
    4
    
    $ cd ~/workspace-as-code
    $ git add dotfiles/.bash_custom dotfiles/.bash_aliases scripts/validate-bash.sh
    $ git commit -m "feat: add bash customizations and aliases"
    $ git push origin main
    

Próximo Tutorial

Agora que nosso shell está otimizado, vamos configurar dois editores poderosos: Vim para edição de texto e Tmux para multiplexação de terminal. Essas ferramentas, quando combinadas com nosso Bash customizado, criarão um ambiente de trabalho verdadeiramente profissional.


Recursos Adicionais


Fim da Parte 2

Próxima: Configurando Vim e Tmux

This post is licensed under CC BY 4.0 by the author.