The Fuck es una magnífica aplicación, inspirada en un tweet de @liamosaur, que corrige errores en comandos anteriores de la consola.
¿ The Fuck es demasiado lento? ¡Prueba el modo instantáneo experimental!
Más ejemplos:
➜ 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
...
Si no tiene miedo de ejecutar comandos corregidos a ciegas, la opción de configuración require_confirmation
se puede desactivar:
➜ 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
...
En macOS o Linux, puedes instalar The Fuck a través de Homebrew:
brew install thefuck
En Ubuntu/Mint, instale The Fuck con los siguientes comandos:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
En FreeBSD, instale The Fuck con los siguientes comandos:
pkg install thefuck
En ChromeOS, instala The Fuck usando Chromebrew con el siguiente comando:
crew install thefuck
En sistemas basados en Arch, instale The Fuck con el siguiente comando:
sudo pacman -S thefuck
En otros sistemas, instale The Fuck usando pip
:
pip install thefuck
Alternativamente, puede utilizar un administrador de paquetes del sistema operativo (OS X, Ubuntu, Arch).
# Se recomienda que coloque este comando en su .bash_profile
, .bashrc
, .zshrc
u otro script de inicio:
eval $( thefuck --alias )
# You can use whatever you want as an alias, like for Mondays:
eval $( thefuck --alias FUCK )
O en la configuración de su shell (Bash, Zsh, Fish, Powershell, tcsh).
Los cambios sólo están disponibles en una nueva sesión de shell. Para que los cambios estén disponibles de inmediato, ejecute source ~/.bashrc
(o su archivo de configuración de shell como .zshrc
).
Para ejecutar comandos fijos sin confirmación, use la opción --yeah
(o simplemente -y
para abreviar, o --hard
si está especialmente frustrado):
fuck --yeah
Para corregir comandos de forma recursiva hasta tener éxito, use la opción -r
:
fuck -r
pip3 install thefuck --upgrade
Nota: La funcionalidad de alias se cambió en la versión 1.34 de The Fuck.
Para eliminar The Fuck , invierta el proceso de instalación:
The Fuck intenta hacer coincidir el comando anterior con una regla. Si se encuentra una coincidencia, se crea un nuevo comando utilizando la regla coincidente y se ejecuta. Las siguientes reglas están habilitadas de forma predeterminada:
adb_unknown_command
: corrige comandos mal escritos como adb logcta
;ag_literal
– agrega -Q
a ag
cuando se sugiere;aws_cli
: corrige comandos mal escritos como aws dynamdb scan
;az_cli
: corrige comandos mal escritos como az providers
;cargo
– ejecuta cargo build
en lugar de cargo
;cargo_no_command
: corrige comandos incorrectos como cargo buid
;cat_dir
– reemplaza cat
con ls
cuando intentas cat
un directorio;cd_correction
: revisa la ortografía y corrige los comandos de cd fallidos;cd_cs
– cambia cs
cd
;cd_mkdir
– crea directorios antes de ingresar en ellos;cd_parent
– cambia cd..
a cd ..
;chmod_x
– agrega bit de ejecución;choco_install
: agrega sufijos comunes para paquetes de chocolate;composer_not_command
– corrige el nombre del comando del compositor;conda_mistype
– corrige los comandos conda;cp_create_destination
: crea un nuevo directorio cuando intentas realizar cp
o mv
a uno que no existecp_omitting_directory
– agrega -a
cuando tu directorio cp
;cpp11
: agrega -std=c++11
faltante a g++
o clang++
;dirty_untar
: corrige el comando tar x
que se descomprimió en el directorio actual;dirty_unzip
: corrige el comando unzip
que se descomprimió en el directorio actual;django_south_ghost
– agrega --delete-ghost-migrations
para fallar porque los fantasmas de la migración de django sur;django_south_merge
– agrega --merge
a la migración inconsistente de django sur;docker_login
: ejecuta un docker login
y repite el comando anterior;docker_not_command
: corrige comandos incorrectos de la ventana acoplable, como docker tags
;docker_image_being_used_by_container
: elimina el contenedor que utiliza la imagen antes de eliminarla;dry
: corrige repeticiones como git git push
;fab_command_not_found
: corrige comandos de tejido mal escritos;fix_alt_space
: reemplaza Alt+Espacio con el carácter Espacio;fix_file
– abre un archivo con un error en su $EDITOR
;gem_unknown_command
– corrige comandos gem
incorrectos;git_add
: corrige "pathspec 'foo' no coincidía con ningún archivo conocido por git". ;git_add_force
– agrega --force
a git add <pathspec>...
cuando las rutas están .gitignore'd;git_bisect_usage
: corrige git bisect strt
, git bisect goood
, git bisect rset
, etc. al bisectar;git_branch_delete
: cambia git branch -d
a git branch -D
;git_branch_delete_checked_out
: cambia git branch -d
a git checkout master && git branch -D
al intentar eliminar una rama retirada;git_branch_exists
: ofrece git branch -d foo
, git branch -D foo
o git checkout foo
al crear una rama que ya existe;git_branch_list
: captura git branch list
en lugar de git branch
y elimina la rama creada;git_branch_0flag
: corrige comandos como git branch 0v
y git branch 0r
eliminando la rama creada;git_checkout
: corrige el nombre de la rama o crea una nueva rama;git_clone_git_clone
: reemplaza git clone git clone ...
con git clone ...
git_clone_missing
: agrega git clone
a las URL que parecen vincular a un repositorio de git.git_commit_add
– ofrece git commit -a ...
o git commit -p ...
después de la confirmación anterior si falló porque no se preparó nada;git_commit_amend
– ofrece git commit --amend
después de la confirmación anterior;git_commit_reset
– ofrece git reset HEAD~
después de la confirmación anterior;git_diff_no_index
: agrega --no-index
al git diff
anterior en archivos sin seguimiento;git_diff_staged
: agrega --staged
al git diff
anterior con un resultado inesperado;git_fix_stash
: corrige los comandos git stash
(subcomando mal escrito y falta save
);git_flag_after_filename
– corrige fatal: bad flag '...' after filename
git_help_aliased
: corrige los comandos git help <alias>
reemplazándolos con el comando con alias;git_hook_bypass
: agrega el indicador --no-verify
anterior al comando git am
, git commit
o git push
;git_lfs_mistype
: corrige comandos git lfs <command>
mal escritos;git_main_master
: corrige el nombre de rama incorrecto entre main
y master
git_merge
: agrega control remoto a los nombres de las sucursales;git_merge_unrelated
: agrega --allow-unrelated-histories
cuando sea necesariogit_not_command
: corrige comandos git incorrectos como git brnch
;git_pull
: configura el flujo ascendente antes de ejecutar git pull
anterior;git_pull_clone
: clona en lugar de extraer cuando el repositorio no existe;git_pull_uncommitted_changes
: guarda los cambios antes de extraerlos y los muestra después;git_push
: agrega --set-upstream origin $branch
al git push
fallido anterior;git_push_different_branch_names
: corrige los push cuando el nombre de la sucursal local no coincide con el nombre de la sucursal remota;git_push_pull
: ejecuta git pull
cuando se rechaza push
;git_push_without_commits
: crea una confirmación inicial si lo olvidas y solo git add .
, al configurar un nuevo proyecto;git_rebase_no_changes
: ejecuta git rebase --skip
en lugar de git rebase --continue
cuando no hay cambios;git_remote_delete
: reemplaza git remote delete remote_name
con git remote remove remote_name
;git_rm_local_modifications
: agrega -f
o --cached
cuando intentas rm
un archivo modificado localmente;git_rm_recursive
: agrega -r
cuando intentas rm
un directorio;git_rm_staged
: agrega -f
o --cached
cuando intentas rm
un archivo con cambios por etapasgit_rebase_merge_dir
: ofrece git rebase (--continue | --abort | --skip)
o elimina el directorio .git/rebase-merge
cuando hay una rebase en progreso;git_remote_seturl_add
: ejecuta git remote add
cuando git remote set_url
en un control remoto inexistente;git_stash
: guarda sus modificaciones locales antes de cambiar de base o cambiar de rama;git_stash_pop
: agrega sus modificaciones locales antes de abrir el alijo y luego se reinicia;git_tag_force
: agrega --force
a git tag <tagname>
cuando la etiqueta ya existe;git_two_dashes
: agrega un guión faltante a comandos como git commit -amend
o git rebase -continue
;go_run
: agrega la extensión .go
al compilar/ejecutar programas Go;go_unknown_command
– corrige comandos go
incorrectos, por ejemplo go bulid
;gradle_no_task
: corrige tareas gradle
no encontradas o ambiguas;gradle_wrapper
: reemplaza gradle
con ./gradlew
;grep_arguments_order
: corrige el orden de los argumentos grep
para situaciones como grep -lir . test
;grep_recursive
– agrega -r
cuando intentas grep
directorio;grunt_task_not_found
– corrige comandos grunt
mal escritos;gulp_not_task
– corrige tareas gulp
mal escritas;has_exists_script
– antepone ./
cuando existe script/binario;heroku_multiple_apps
: agrega --app <app>
a los comandos heroku
como heroku pg
;heroku_not_command
: corrige comandos incorrectos heroku
como heroku log
;history
: intenta reemplazar el comando con el comando más similar del historial;hostscli
– intenta arreglar el uso hostscli
;ifconfig_device_not_found
: corrige nombres de dispositivos incorrectos como wlan0
a wlp2s0
;java
: elimina la extensión .java
cuando se ejecutan programas Java;javac
: agrega .java
que falta al compilar archivos Java;lein_not_task
: corrige tareas lein
incorrectas como lein rpl
;long_form_help
: cambia -h
a --help
cuando la versión corta no es compatibleln_no_hard_link
: detecta la creación de enlaces físicos en directorios y sugiere enlaces simbólicos;ln_s_order
– corrige el orden de los argumentos ln -s
;ls_all
– agrega -A
a ls
cuando la salida está vacía;ls_lah
– agrega -lah
a ls
;man
– cambia la sección del manual;man_no_space
– corrige comandos man sin espacios, por ejemplo mandiff
;mercurial
: corrige comandos hg
incorrectos;missing_space_before_subcommand
: corrige el comando al que le falta espacio como npminstall
;mkdir_p
: agrega -p
cuando intentas crear un directorio sin padre;mvn_no_command
: agrega clean package
a mvn
;mvn_unknown_lifecycle_phase
: corrige las fases del ciclo de vida mal escritas con mvn
;npm_missing_script
: corrige el nombre del script personalizado npm
en npm run-script <script>
;npm_run_script
: agrega run-script
que falta para los scripts npm
personalizados;npm_wrong_command
: corrige comandos npm incorrectos como npm urgrade
;no_command
– corrige comandos de consola incorrectos, por ejemplo vom/vim
;no_such_file
: crea directorios faltantes con los comandos mv
y cp
;omnienv_no_such_command
: corrige comandos incorrectos para goenv
, nodenv
, pyenv
y rbenv
(por ejemplo: pyenv isntall
o goenv list
);open
: antepone http://
a la dirección pasada para open
o crea un nuevo archivo o directorio y lo pasa para open
;pip_install
: soluciona problemas de permisos con los comandos pip install
agregando --user
o anteponiendo sudo
si es necesario;pip_unknown_command
– corrige comandos pip
incorrectos, por ejemplo pip instatl/pip install
;php_s
– reemplaza -s
por -S
al intentar ejecutar un servidor php local;port_already_in_use
: elimina el proceso que enlaza el puerto;prove_recursively
– agrega -r
cuando se llama con el directorio;python_command
: antepone python
cuando intenta ejecutar un script no ejecutable/sin ./
python;python_execute
: agrega .py
que falta al ejecutar archivos Python;python_module_error
: corrige ModuleNotFoundError al intentar pip install
ese módulo;quotation_marks
: corrige el uso desigual de '
y "
cuando contienen argumentos';path_from_history
– reemplaza la ruta no encontrada con una ruta absoluta similar del historial;rails_migrations_pending
– ejecuta migraciones pendientes;react_native_command_unrecognized
: corrige comandos react-native
no reconocidos;remove_shell_prompt_literal
: elimina el símbolo inicial del símbolo del shell $
, común al copiar comandos de la documentación;remove_trailing_cedilla
– elimina las cedillas finales ç
, un error tipográfico común en los diseños de teclado europeos;rm_dir
– agrega -rf
cuando intentas eliminar un directorio;scm_correction
– corrige SCM incorrecto como hg log
a git log
;sed_unterminated_s
: agrega '/' faltante a los comandos s
sed
;sl_ls
– cambia sl
a ls
;ssh_known_hosts
: elimina el host known_hosts
al recibir una advertencia;sudo
: antepone sudo
al comando anterior si falló debido a permisos;sudo_command_from_user_path
– ejecuta comandos de los usuarios $PATH
con sudo
;switch_lang
: cambia el comando de su diseño local a en;systemctl
– ordena correctamente los parámetros de systemctl
confuso;terraform_init.py
: ejecuta terraform init
antes de planificar o aplicar;terraform_no_command.py
: corrige comandos terraform
no reconocidos;test.py
: ejecuta pytest
en lugar de test.py
;touch
– crea directorios faltantes antes de "tocar";tsuru_login
: ejecuta tsuru login
si no está autenticado o la sesión expiró;tsuru_not_command
: corrige comandos tsuru
incorrectos como tsuru shell
;tmux
– corrige los comandos tmux
;unknown_command
: corrige el "comando desconocido" estilo hadoop hdfs; por ejemplo, agrega '-' faltante al comando en hdfs dfs ls
;unsudo
: elimina sudo
del comando anterior si un proceso se niega a ejecutarse con privilegios de superusuario.vagrant_up
– inicia la instancia vagabunda;whois
– corrige el comando whois
;workon_doesnt_exists
: corrige el nombre del entorno virtualenvwrapper
que el sistema operativo sugiere para crear uno nuevo.wrong_hyphen_before_subcommand
: elimina un guión colocado incorrectamente ( apt-install
-> apt install
, git-log
-> git log
, etc.)yarn_alias
: corrige comandos yarn
con alias como yarn ls
;yarn_command_not_found
– corrige comandos yarn
mal escritos;yarn_command_replaced
– corrige los comandos yarn
reemplazados;yarn_help
: facilita la apertura de la documentación yarn
; Las siguientes reglas están habilitadas de forma predeterminada solo en plataformas específicas:
apt_get
: instala la aplicación desde apt si no está instalada (requiere python-commandnotfound
/ python3-commandnotfound
);apt_get_search
– cambios al intentar buscar usando apt-get
con la búsqueda usando apt-cache
;apt_invalid_operation
: corrige llamadas inválidas apt
y apt-get
, como apt-get isntall vim
;apt_list_upgradable
: le ayuda a ejecutar apt list --upgradable
después de apt update
;apt_upgrade
: le ayuda a ejecutar apt upgrade
después de apt list --upgradable
;brew_cask_dependency
– instala dependencias de barril;brew_install
: corrige el nombre de la fórmula para brew install
;brew_reinstall
– convierte brew install <formula>
en brew reinstall <formula>
;brew_link
: agrega --overwrite --dry-run
si falla el enlace;brew_uninstall
: agrega --force
para brew uninstall
si se instalaron varias versiones;brew_unknown_command
: corrige comandos de preparación incorrectos, por ejemplo, brew docto/brew doctor
;brew_update_formula
– convierte brew update <formula>
en brew upgrade <formula>
;dnf_no_such_command
– corrige comandos DNF mal escritos;nixos_cmd_not_found
– instala aplicaciones en NixOS;pacman
: instala la aplicación con pacman
si no está instalada (usa yay
, pikaur
o yaourt
si está disponible);pacman_invalid_option
: reemplaza las opciones pacman
en minúsculas por mayúsculas.pacman_not_found
: corrige el nombre del paquete con pacman
, yay
, pikaur
o yaourt
.yum_invalid_operation
: corrige llamadas yum
no válidas, como yum isntall vim
;Los siguientes comandos están incluidos con The Fuck , pero no están habilitados de forma predeterminada:
git_push_force
: agrega --force-with-lease
a un git push
(puede entrar en conflicto con git_push_pull
);rm_root
: agrega --no-preserve-root
al comando rm -rf /
. Para agregar su propia regla, cree un archivo llamado your-rule-name.py
en ~/.config/thefuck/rules
. El archivo de reglas debe contener dos funciones:
match ( command : Command ) - > bool
get_new_command ( command : Command ) - > str | list [ str ]
Además, las reglas pueden contener funciones opcionales:
side_effect ( old_command : Command , fixed_command : str ) - > None
Las reglas también pueden contener las variables opcionales enabled_by_default
, requires_output
y priority
.
Command
tiene tres atributos: script
, output
y script_parts
. Tu regla no debería cambiar Command
.
La API de reglas cambió en 3.0: para acceder a la configuración de una regla, impórtela from thefuck.conf import settings
settings
es un objeto especial ensamblado a partir de ~/.config/thefuck/settings.py
y valores de env (ver más a continuación).
Una regla de ejemplo simple para ejecutar un script con 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
Más ejemplos de reglas, funciones de utilidad para reglas, ayudantes específicos de aplicaciones/sistemas operativos.
Se pueden cambiar varios parámetros de The Fuck en el archivo $XDG_CONFIG_HOME/thefuck/settings.py
(el valor predeterminado $XDG_CONFIG_HOME
es ~/.config
):
rules
: lista de reglas habilitadas, de forma predeterminada thefuck.const.DEFAULT_RULES
;exclude_rules
– lista de reglas deshabilitadas, por defecto []
;require_confirmation
: requiere confirmación antes de ejecutar un nuevo comando, por defecto True
;wait_command
: la cantidad máxima de tiempo en segundos para obtener la salida del comando anterior;no_colors
: desactiva la salida en color;priority
: dicta con las prioridades de las reglas, la regla con menor priority
coincidirá primero;debug
: habilita la salida de depuración, por defecto False
;history_limit
: el valor numérico de cuántos comandos del historial se escanearán, como 2000
;alter_history
: envía el comando fijo al historial, por defecto True
;wait_slow_command
: cantidad máxima de tiempo en segundos para obtener la salida del comando anterior si está en la lista slow_commands
;slow_commands
– lista de comandos lentos;num_close_matches
: el número máximo de coincidencias cercanas a sugerir, de forma predeterminada 3
.excluded_search_path_prefixes
: prefijos de ruta que se deben ignorar al buscar comandos, de forma predeterminada []
. Un ejemplo 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
O mediante variables de entorno:
THEFUCK_RULES
: lista de reglas habilitadas, como DEFAULT_RULES:rm_root
o sudo:no_command
;THEFUCK_EXCLUDE_RULES
– lista de reglas deshabilitadas, como git_pull:git_push
;THEFUCK_REQUIRE_CONFIRMATION
: requiere confirmación antes de ejecutar un nuevo comando, true/false
;THEFUCK_WAIT_COMMAND
: la cantidad máxima de tiempo en segundos para obtener la salida del comando anterior;THEFUCK_NO_COLORS
: deshabilita la salida en color, true/false
;THEFUCK_PRIORITY
: prioridad de las reglas, como no_command=9999:apt_get=100
, la regla con menor priority
coincidirá primero;THEFUCK_DEBUG
: habilita la salida de depuración, true/false
;THEFUCK_HISTORY_LIMIT
: cuántos comandos del historial se escanearán, como 2000
;THEFUCK_ALTER_HISTORY
: envía el comando fijo al historial true/false
;THEFUCK_WAIT_SLOW_COMMAND
: la cantidad máxima de tiempo en segundos para obtener la salida del comando anterior si está en la lista slow_commands
;THEFUCK_SLOW_COMMANDS
– lista de comandos lentos, como lein:gradle
;THEFUCK_NUM_CLOSE_MATCHES
: el número máximo de coincidencias cercanas para sugerir, como 5
.THEFUCK_EXCLUDED_SEARCH_PATH_PREFIXES
: prefijos de ruta que se deben ignorar al buscar comandos, de forma predeterminada []
.Por ejemplo:
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 '
Si desea crear un conjunto específico de reglas no públicas, pero aún desea compartirlas con otros, cree un paquete llamado thefuck_contrib_*
con la siguiente estructura:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
The Fuck encontrará reglas ubicadas en el módulo rules
.
El comportamiento predeterminado de The Fuck requiere tiempo para volver a ejecutar los comandos anteriores. Cuando está en modo instantáneo, The Fuck ahorra tiempo al registrar la salida con un script y luego leer el registro.
Actualmente, el modo instantáneo solo admite Python 3 con bash o zsh. La función de autocorrección de zsh también debe desactivarse para que thefuck funcione correctamente.
Para habilitar el modo instantáneo, agregue --enable-experimental-instant-mode
a la inicialización del alias en .bashrc
, .bash_profile
o .zshrc
.
Por ejemplo:
eval $( thefuck --alias --enable-experimental-instant-mode )
Ver CONTRIBUCIÓN.md
La licencia del proyecto se puede encontrar aquí.