The Fuck é um aplicativo magnífico, inspirado em um tweet de @liamosaur, que corrige erros em comandos anteriores do console.
The Fuck é muito lento? Experimente o modo instantâneo experimental!
Mais exemplos:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root ?
➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...
➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...
➜ puthon
No command ' puthon ' found, did you mean:
Command ' python ' from package ' python-minimal ' (main)
Command ' python ' from package ' python3 ' (main)
zsh: command not found: puthon
➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct 8 2014, 13:08:17)
...
➜ git brnch
git: ' brnch ' is not a git command. See ' git --help ' .
Did you mean this ?
branch
➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master
➜ lein rpl
' rpl ' is not a task. See ' lein help ' .
Did you mean this ?
repl
➜ fuck
lein repl [enter/↑/↓/ctrl+c]
nREPL server started on port 54848 on host 127.0.0.1 - nrepl://127.0.0.1:54848
REPL-y 0.3.1
...
Se você não tem medo de executar comandos corrigidos às cegas, a opção de configurações require_confirmation
pode ser desativada:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root ?
➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...
No macOS ou Linux, você pode instalar o The Fuck via Homebrew:
brew install thefuck
No Ubuntu/Mint, instale o The Fuck com os seguintes comandos:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
No FreeBSD, instale The Fuck com os seguintes comandos:
pkg install thefuck
No ChromeOS, instale The Fuck usando chromebrew com o seguinte comando:
crew install thefuck
Em sistemas baseados em Arch, instale The Fuck com o seguinte comando:
sudo pacman -S thefuck
Em outros sistemas, instale The Fuck usando pip
:
pip install thefuck
Alternativamente, você pode usar um gerenciador de pacotes de sistema operacional (OS X, Ubuntu, Arch).
# É recomendado que você coloque este comando em seu .bash_profile
, .bashrc
, .zshrc
ou outro script de inicialização:
eval $( thefuck --alias )
# You can use whatever you want as an alias, like for Mondays:
eval $( thefuck --alias FUCK )
Ou na configuração do seu shell (Bash, Zsh, Fish, Powershell, tcsh).
As alterações estão disponíveis apenas em uma nova sessão de shell. Para disponibilizar as alterações imediatamente, execute source ~/.bashrc
(ou seu arquivo de configuração do shell como .zshrc
).
Para executar comandos fixos sem confirmação, use a opção --yeah
(ou apenas -y
para abreviar, ou --hard
se você estiver especialmente frustrado):
fuck --yeah
Para corrigir comandos recursivamente até obter sucesso, use a opção -r
:
fuck -r
pip3 install thefuck --upgrade
Nota: A funcionalidade do Alias foi alterada na v1.34 do The Fuck
Para remover The Fuck , inverta o processo de instalação:
The Fuck tenta combinar o comando anterior com uma regra. Se uma correspondência for encontrada, um novo comando será criado usando a regra correspondente e executado. As seguintes regras estão habilitadas por padrão:
adb_unknown_command
– corrige comandos com erros ortográficos como adb logcta
;ag_literal
– adiciona -Q
a ag
quando sugerido;aws_cli
– corrige comandos com erros ortográficos, como aws dynamdb scan
;az_cli
– corrige comandos com erros ortográficos, como az providers
;cargo
– executa cargo build
em vez de cargo
;cargo_no_command
– corrige comandos errados como cargo buid
;cat_dir
– substitui cat
por ls
quando você tenta cat
um diretório;cd_correction
– verifica a ortografia e corrige comandos de cd com falha;cd_cs
– altera cs
para cd
;cd_mkdir
– cria diretórios antes de fazer cd neles;cd_parent
– altera cd..
para cd ..
;chmod_x
– adiciona bit de execução;choco_install
– acrescenta sufixos comuns para pacotes de chocolate;composer_not_command
– corrige o nome do comando do compositor;conda_mistype
– corrige comandos conda;cp_create_destination
– cria um novo diretório quando você tenta cp
ou mv
para um inexistentecp_omitting_directory
– adiciona -a
quando você cp
diretório;cpp11
– adiciona -std=c++11
ausente a g++
ou clang++
;dirty_untar
– corrige o comando tar x
que foi descompactado no diretório atual;dirty_unzip
– corrige o comando unzip
que descompactou no diretório atual;django_south_ghost
– adiciona --delete-ghost-migrations
para falhou porque fantasmas django migração para o sul;django_south_merge
– adiciona --merge
à migração inconsistente do django para o sul;docker_login
– executa um docker login
e repete o comando anterior;docker_not_command
– corrige comandos docker errados, como docker tags
;docker_image_being_used_by_container
– remove o contêiner que está usando a imagem antes de removê-la;dry
– corrige repetições como git git push
;fab_command_not_found
– corrige comandos de fabric com erros ortográficos;fix_alt_space
– substitui Alt+Espaço pelo caractere Espaço;fix_file
– abre um arquivo com erro no seu $EDITOR
;gem_unknown_command
– corrige comandos gem
errados;git_add
– corrige "pathspec 'foo' não corresponde a nenhum arquivo conhecido pelo git." ;git_add_force
– adiciona --force
a git add <pathspec>...
quando os caminhos são .gitignore'd;git_bisect_usage
– corrige git bisect strt
, git bisect goood
, git bisect rset
, etc.git_branch_delete
– altera git branch -d
para git branch -D
;git_branch_delete_checked_out
– altera git branch -d
para git checkout master && git branch -D
ao tentar excluir um branch com check-out;git_branch_exists
– oferece git branch -d foo
, git branch -D foo
ou git checkout foo
ao criar um branch que já existe;git_branch_list
– captura git branch list
no lugar da git branch
e remove a ramificação criada;git_branch_0flag
– corrige comandos como git branch 0v
e git branch 0r
removendo o branch criado;git_checkout
– corrige o nome da branch ou cria uma nova branch;git_clone_git_clone
– substitui git clone git clone ...
por git clone ...
git_clone_missing
– adiciona git clone
a URLs que parecem vincular a um repositório git.git_commit_add
– oferece git commit -a ...
ou git commit -p ...
após o commit anterior se falhou porque nada foi testado;git_commit_amend
– oferece git commit --amend
após commit anterior;git_commit_reset
– oferece git reset HEAD~
após commit anterior;git_diff_no_index
– adiciona --no-index
ao git diff
anterior em arquivos não rastreados;git_diff_staged
– adiciona --staged
ao git diff
anterior com saída inesperada;git_fix_stash
– corrige comandos git stash
(subcomando com erros ortográficos e save
ausente);git_flag_after_filename
– corrige fatal: bad flag '...' after filename
git_help_aliased
– corrige comandos git help <alias>
substituindo pelo comando com alias;git_hook_bypass
– adiciona o sinalizador --no-verify
anterior ao comando git am
, git commit
ou git push
;git_lfs_mistype
– corrige comandos git lfs <command>
digitados incorretamente;git_main_master
– corrige nome de branch incorreto entre main
e master
git_merge
– adiciona remoto aos nomes das filiais;git_merge_unrelated
– adiciona --allow-unrelated-histories
quando necessáriogit_not_command
– corrige comandos git errados como git brnch
;git_pull
– configura o upstream antes de executar git pull
anterior;git_pull_clone
– clona em vez de puxar quando o repositório não existe;git_pull_uncommitted_changes
– armazena as alterações antes de extraí-las e as exibe depois;git_push
– adiciona --set-upstream origin $branch
ao git push
anterior com falha;git_push_different_branch_names
– corrige pushes quando o nome da filial local não corresponde ao nome da filial remota;git_push_pull
– executa git pull
quando push
foi rejeitado;git_push_without_commits
– cria um commit inicial se você esquecer e apenas git add .
, ao montar um novo projeto;git_rebase_no_changes
– executa git rebase --skip
em vez de git rebase --continue
quando não há alterações;git_remote_delete
– substitui git remote delete remote_name
por git remote remove remote_name
;git_rm_local_modifications
– adiciona -f
ou --cached
quando você tenta rm
um arquivo modificado localmente;git_rm_recursive
– adiciona -r
quando você tenta rm
um diretório;git_rm_staged
– adiciona -f
ou --cached
quando você tenta rm
um arquivo com alterações preparadasgit_rebase_merge_dir
– oferece git rebase (--continue | --abort | --skip)
ou remove o diretório .git/rebase-merge
quando um rebase está em andamento;git_remote_seturl_add
– executa git remote add
quando git remote set_url
em um remoto inexistente;git_stash
– armazena suas modificações locais antes de rebasear ou mudar de branch;git_stash_pop
– adiciona suas modificações locais antes de abrir o stash e depois redefine;git_tag_force
– adiciona --force
à git tag <tagname>
quando a tag já existe;git_two_dashes
– adiciona um traço ausente a comandos como git commit -amend
ou git rebase -continue
;go_run
– acrescenta a extensão .go
ao compilar/executar programas Go;go_unknown_command
– corrige comandos go
errados, por exemplo go bulid
;gradle_no_task
– correções não encontradas ou tarefa gradle
ambígua;gradle_wrapper
– substitui gradle
por ./gradlew
;grep_arguments_order
– corrige a ordem dos argumentos grep
para situações como grep -lir . test
;grep_recursive
– adiciona -r
quando você tenta acessar o diretório grep
;grunt_task_not_found
– corrige comandos grunt
com erros ortográficos;gulp_not_task
– corrige tarefas gulp
com erros ortográficos;has_exists_script
– precede ./
quando existe script/binário;heroku_multiple_apps
– adiciona --app <app>
aos comandos heroku
como heroku pg
;heroku_not_command
– corrige comandos heroku
errados, como heroku log
;history
– tenta substituir o comando pelo comando mais semelhante do histórico;hostscli
– tenta corrigir o uso hostscli
;ifconfig_device_not_found
– corrige nomes de dispositivos errados como wlan0
para wlp2s0
;java
– remove a extensão .java
ao executar programas Java;javac
– anexa .java
ausente ao compilar arquivos Java;lein_not_task
– corrige tarefas lein
erradas como lein rpl
;long_form_help
– muda -h
para --help
quando a versão abreviada não é suportadaln_no_hard_link
– captura a criação de links físicos em diretórios, sugere link simbólico;ln_s_order
– corrige a ordem dos argumentos ln -s
;ls_all
– adiciona -A
a ls
quando a saída está vazia;ls_lah
– adiciona -lah
a ls
;man
– altera a seção do manual;man_no_space
– corrige comandos man sem espaços, por exemplo mandiff
;mercurial
– corrige comandos hg
errados;missing_space_before_subcommand
– corrige comando com falta de espaço como npminstall
;mkdir_p
– adiciona -p
quando você tenta criar um diretório sem pai;mvn_no_command
– adiciona clean package
ao mvn
;mvn_unknown_lifecycle_phase
– corrige fases do ciclo de vida com erros ortográficos com mvn
;npm_missing_script
– corrige o nome do script personalizado npm
em npm run-script <script>
;npm_run_script
– adiciona run-script
ausente para scripts npm
personalizados;npm_wrong_command
– corrige comandos npm errados como npm urgrade
;no_command
– corrige comandos de console errados, por exemplo vom/vim
;no_such_file
– cria diretórios ausentes com comandos mv
e cp
;omnienv_no_such_command
– corrige comandos errados para goenv
, nodenv
, pyenv
e rbenv
(ex.: pyenv isntall
ou goenv list
);open
– acrescenta http://
ao endereço passado para open
ou cria um novo arquivo ou diretório e o passa para open
;pip_install
– corrige problemas de permissão com comandos pip install
adicionando --user
ou acrescentando sudo
se necessário;pip_unknown_command
– corrige comandos pip
errados, por exemplo pip instatl/pip install
;php_s
– substitui -s
por -S
ao tentar executar um servidor php local;port_already_in_use
– mata o processo que vincula a porta;prove_recursively
– adiciona -r
quando chamado com diretório;python_command
– acrescenta python
quando você tenta executar script não executável/sem ./
python;python_execute
– acrescenta .py
ausente ao executar arquivos Python;python_module_error
– corrige ModuleNotFoundError tentando pip install
esse módulo;quotation_marks
– corrige o uso desigual de '
e "
ao conter argumentos';path_from_history
– substitui o caminho não encontrado por um caminho absoluto semelhante do histórico;rails_migrations_pending
– executa migrações pendentes;react_native_command_unrecognized
– corrige comandos react-native
não reconhecidos;remove_shell_prompt_literal
– remove o símbolo inicial do prompt do shell $
, comum ao copiar comandos de documentações;remove_trailing_cedilla
– remove cedilhas finais ç
, um erro de digitação comum em layouts de teclado europeus;rm_dir
– adiciona -rf
quando você tenta remover um diretório;scm_correction
– corrige scm errado como hg log
para git log
;sed_unterminated_s
– adiciona '/' ausente aos comandos s
sed
;sl_ls
– altera sl
para ls
;ssh_known_hosts
– remove o host known_hosts
mediante aviso;sudo
– acrescenta sudo
ao comando anterior se ele falhou devido a permissões;sudo_command_from_user_path
– executa comandos de usuários $PATH
com sudo
;switch_lang
– muda o comando do seu layout local para en;systemctl
– ordena corretamente os parâmetros do confuso systemctl
;terraform_init.py
– executa terraform init
antes de planejar ou aplicar;terraform_no_command.py
– corrige comandos terraform
não reconhecidos;test.py
– executa pytest
em vez de test.py
;touch
– cria diretórios ausentes antes de “tocar”;tsuru_login
– executa tsuru login
se não estiver autenticado ou a sessão expirar;tsuru_not_command
– corrige comandos tsuru
errados como tsuru shell
;tmux
– corrige comandos tmux
;unknown_command
– corrige o "comando desconhecido" do estilo hadoop hdfs, por exemplo, adiciona '-' ausente ao comando em hdfs dfs ls
;unsudo
– remove sudo
do comando anterior se um processo se recusar a ser executado com privilégio de superusuário.vagrant_up
– inicia a instância do vagrant;whois
– corrige o comando whois
;workon_doesnt_exists
– corrige o nome do ambiente virtualenvwrapper
que sugere a criação de um novo.wrong_hyphen_before_subcommand
– remove um hífen colocado incorretamente ( apt-install
-> apt install
, git-log
-> git log
, etc.)yarn_alias
– corrige comandos de alias do yarn
como yarn ls
;yarn_command_not_found
– corrige comandos yarn
com erros ortográficos;yarn_command_replaced
– corrige comandos yarn
substituídos;yarn_help
– facilita a abertura da documentação yarn
; As seguintes regras são habilitadas por padrão apenas em plataformas específicas:
apt_get
– instala o aplicativo do apt se não estiver instalado (requer python-commandnotfound
/ python3-commandnotfound
);apt_get_search
– altera a tentativa de pesquisar usando apt-get
com a pesquisa usando apt-cache
;apt_invalid_operation
– corrige chamadas inválidas apt
e apt-get
, como apt-get isntall vim
;apt_list_upgradable
– ajuda você a executar apt list --upgradable
após apt update
;apt_upgrade
– ajuda você a executar apt upgrade
após apt list --upgradable
;brew_cask_dependency
– instala dependências do barril;brew_install
– corrige o nome da fórmula para brew install
;brew_reinstall
– transforma brew install <formula>
em brew reinstall <formula>
;brew_link
– adiciona --overwrite --dry-run
se a vinculação falhar;brew_uninstall
– adiciona --force
à brew uninstall
se várias versões foram instaladas;brew_unknown_command
– corrige comandos brew errados, por exemplo brew docto/brew doctor
;brew_update_formula
– transforma brew update <formula>
em brew upgrade <formula>
;dnf_no_such_command
– corrige comandos DNF digitados incorretamente;nixos_cmd_not_found
– instala aplicativos no NixOS;pacman
– instala o aplicativo com pacman
se não estiver instalado (usa yay
, pikaur
ou yaourt
se disponível);pacman_invalid_option
– substitui as opções minúsculas pacman
por maiúsculas.pacman_not_found
– corrige o nome do pacote com pacman
, yay
, pikaur
ou yaourt
.yum_invalid_operation
– corrige chamadas inválidas yum
, como yum isntall vim
;Os seguintes comandos são fornecidos com The Fuck , mas não estão habilitados por padrão:
git_push_force
– adiciona --force-with-lease
a um git push
(pode entrar em conflito com git_push_pull
);rm_root
– adiciona --no-preserve-root
ao comando rm -rf /
. Para adicionar sua própria regra, crie um arquivo chamado your-rule-name.py
em ~/.config/thefuck/rules
. O arquivo de regras deve conter duas funções:
match ( command : Command ) - > bool
get_new_command ( command : Command ) - > str | list [ str ]
Além disso, as regras podem conter funções opcionais:
side_effect ( old_command : Command , fixed_command : str ) - > None
As regras também podem conter as variáveis opcionais enabled_by_default
, requires_output
e priority
.
Command
possui três atributos: script
, output
e script_parts
. Sua regra não deve mudar Command
.
API de regras alterada na versão 3.0: para acessar as configurações de uma regra, importe-a com from thefuck.conf import settings
settings
é um objeto especial montado em ~/.config/thefuck/settings.py
e valores em env (veja mais abaixo).
Um exemplo de regra simples para executar um script com sudo
:
def match ( command ):
return ( 'permission denied' in command . output . lower ()
or 'EACCES' in command . output )
def get_new_command ( command ):
return 'sudo {}' . format ( command . script )
# Optional:
enabled_by_default = True
def side_effect ( command , fixed_command ):
subprocess . call ( 'chmod 777 .' , shell = True )
priority = 1000 # Lower first, default is 1000
requires_output = True
Mais exemplos de regras, funções utilitárias para regras, auxiliares específicos de aplicativos/sistemas operacionais.
Vários parâmetros The Fuck podem ser alterados no arquivo $XDG_CONFIG_HOME/thefuck/settings.py
(o padrão de $XDG_CONFIG_HOME
é ~/.config
):
rules
– lista de regras habilitadas, por padrão thefuck.const.DEFAULT_RULES
;exclude_rules
– lista de regras desabilitadas, por padrão []
;require_confirmation
– requer confirmação antes de executar o novo comando, por padrão True
;wait_command
– o tempo máximo em segundos para obter a saída do comando anterior;no_colors
– desativa a saída colorida;priority
– dict com prioridades de regras, a regra com priority
mais baixa será correspondida primeiro;debug
– habilita a saída de depuração, por padrão False
;history_limit
– o valor numérico de quantos comandos de histórico serão verificados, como 2000
;alter_history
– envia o comando fixo para o histórico, por padrão True
;wait_slow_command
– quantidade máxima de tempo em segundos para obter a saída do comando anterior se estiver na lista slow_commands
;slow_commands
– lista de comandos lentos;num_close_matches
– o número máximo de correspondências aproximadas a serem sugeridas, por padrão 3
.excluded_search_path_prefixes
– prefixos de caminho a serem ignorados ao pesquisar comandos, por padrão []
. Um exemplo de settings.py
:
rules = [ 'sudo' , 'no_command' ]
exclude_rules = [ 'git_push' ]
require_confirmation = True
wait_command = 10
no_colors = False
priority = { 'sudo' : 100 , 'no_command' : 9999 }
debug = False
history_limit = 9999
wait_slow_command = 20
slow_commands = [ 'react-native' , 'gradle' ]
num_close_matches = 5
Ou através de variáveis de ambiente:
THEFUCK_RULES
– lista de regras habilitadas, como DEFAULT_RULES:rm_root
ou sudo:no_command
;THEFUCK_EXCLUDE_RULES
– lista de regras desabilitadas, como git_pull:git_push
;THEFUCK_REQUIRE_CONFIRMATION
– requer confirmação antes de executar novo comando, true/false
;THEFUCK_WAIT_COMMAND
– o tempo máximo em segundos para obter a saída do comando anterior;THEFUCK_NO_COLORS
– desativa a saída colorida, true/false
;THEFUCK_PRIORITY
– prioridade das regras, como no_command=9999:apt_get=100
, regra com priority
mais baixa será correspondida primeiro;THEFUCK_DEBUG
– ativa a saída de depuração, true/false
;THEFUCK_HISTORY_LIMIT
– quantos comandos de histórico serão verificados, como 2000
;THEFUCK_ALTER_HISTORY
– envia o comando fixo para o histórico true/false
;THEFUCK_WAIT_SLOW_COMMAND
– a quantidade máxima de tempo em segundos para obter a saída do comando anterior se estiver na lista slow_commands
;THEFUCK_SLOW_COMMANDS
– lista de comandos lentos, como lein:gradle
;THEFUCK_NUM_CLOSE_MATCHES
– o número máximo de correspondências aproximadas a serem sugeridas, como 5
.THEFUCK_EXCLUDED_SEARCH_PATH_PREFIXES
– prefixos de caminho a serem ignorados ao procurar comandos, por padrão []
.Por exemplo:
export THEFUCK_RULES= ' sudo:no_command '
export THEFUCK_EXCLUDE_RULES= ' git_pull:git_push '
export THEFUCK_REQUIRE_CONFIRMATION= ' true '
export THEFUCK_WAIT_COMMAND=10
export THEFUCK_NO_COLORS= ' false '
export THEFUCK_PRIORITY= ' no_command=9999:apt_get=100 '
export THEFUCK_HISTORY_LIMIT= ' 2000 '
export THEFUCK_NUM_CLOSE_MATCHES= ' 5 '
Se você quiser criar um conjunto específico de regras não públicas, mas ainda quiser compartilhá-las com outras pessoas, crie um pacote chamado thefuck_contrib_*
com a seguinte estrutura:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
The Fuck encontrará regras localizadas no módulo rules
.
O comportamento padrão do The Fuck requer tempo para executar novamente os comandos anteriores. Quando no modo instantâneo, The Fuck economiza tempo registrando a saída com script e depois lendo o log.
Atualmente, o modo instantâneo suporta apenas Python 3 com bash ou zsh. A função de autocorreção do zsh também precisa ser desativada para que thefuck funcione corretamente.
Para ativar o modo instantâneo, adicione --enable-experimental-instant-mode
à inicialização do alias em .bashrc
, .bash_profile
ou .zshrc
.
Por exemplo:
eval $( thefuck --alias --enable-experimental-instant-mode )
Veja CONTRIBUTING.md
A licença do projeto pode ser encontrada aqui.