thefuck是如何帮助你提高命令行效率

53 阅读5分钟

文章目录

99% 的人都不知道的: 命令行竟然存在 fuck 命令!功能强大

the fuck是什么

thefuck是开源的命令行纠错工具,可以用于纠正执上一条执行错误的指令

image-1743978870468gif

常用Linux的小伙伴可能会遇到这样的问题,在输入指令时总是因为忘了添加sudo

导致权限不足无法执行

image-1743978870707.png

如果指令很长,又忘了Linux光标跳转快捷键,就不得不猛敲键盘手动添加sudo

如果安装thefuck,只需对着键盘一顿fuck

正确的指令就会显示在终端

image-1743978871626.png

此外,thefuck还可以自动帮你输出安装工具

如果shell在执行时发现指令不存在

此时只需输入fuck

终端就会显示相应的纠正指令

image-1743978871808.png

如何安装

既然fuck这么好用,那我该怎么安装呢?

thefuck支持多个操作系统

但不管是你使用的Mac,Linux,还是Windows

他们仨使安装过程都大同小异

下载python环境(大于3.5.0),安装thefuck,配置别名

首先是Windows

打开powershell

输入pip install thefuck

安装thefuck

image-1743978872080.png

随后在powershell的配置文件中写入如下两条指令

$env:PYTHONIOENCODING="utf-8"
iex "$(thefuck --alias)"

重启powershell,即可完成配置

此时你可能会感到疑惑,powershell的配置,这是啥?我没有啊

没关系,只需短短三行指令,1秒解决你的疑惑

打开powershell,输入如下三条指令

echo $profile

Test-Path $profile

New-Item -Path $profile -Type File –Force

image-1743978872285.png

在资源管理器中进入目录:C:\Users\<用户名>\Documents\WindowsPowerShell

会发现目录下多出了Microsoft.PowerShell_profile.ps1文件

这就是powershell的配置信息

image-1743978872880.png 每次powershell打开前都会加载该文件

image-1743978873106.png

其次是Linux

依然是先安装thefuck

在终端输入如下指令

sudo apt update \
sudo apt install python3-dev python3-pip python3-setuptools \
pip3 install thefuck --user

随后输入vim ~/.bashrc

打开shell的配置文件

并在末尾写入eval $(thefuck --alias)

将fuck作为thefuck的别名

image-1743978873627.png

退出.bashrc,并执行配置文件

此时可以正常使用fuck

看到这里,你可能会觉得,这有啥大不了的,不就是多打了几个字嘛,至于这么折腾?

欸嘿,您可别小看了程序员为了"偷懒"能搞出来的那些事儿。这群家伙为了少敲几下键盘,能想出各种奇葩的破事儿

Guido van Rossum在CWI研究所工作时,受够C那繁琐的语法,为了偷懒,徒手搓了个python。python因其简洁的语法被众多开发者喜爱,开发者们甚至打出了这样的口号,life is short, you need python

Max Howell在Mac上安装软件时受够手动编译依赖的痛苦,为了"偷懒",愣是用Ruby撸了一套管理器,通过brew install一键解决依赖

这里说个小插曲,Google曾因Max Howell不会手写二叉树反转而拒绝其面试。因此只要答对这道题,您就可以超越世界级大牛,问鼎码林之巅

这里,需要额外提一嘴,一个比较操蛋的bug

fuck写错了

如果fuck写错没看出来,傻乎乎的以为下载出错,于是重新装了一遍

找问题配环境一小时,最后发现fuck打成funk,这回可真fuck了

原理

不多BB,先放简化流程图

image-1743978874912jpeg

模块划分

抛开和不同操作系统交互的模块,聚焦于更核心的逻辑

从宏观上,thefuck可以分为三大模块

解析器,流程控制模块,不同分支处理模块

image-1743978873992.png

分支处理继续细分,可得到help打印,版本打印,指令纠正等等\

image-1743978874158.png

模块介绍

解析器Parser,负责读取上一条用户输入的指令

并通过调用parse()方法将指令处理为系统可识别的对象

know_args

image-1743978874338.png 之后,流程控制模块将根据know_args中

不同的数据信息进行不同的分支处理

譬如打印帮助文档

打印版本

打印别名

还有最重要的指令纠正,fix_command

image-1743978874536.png

处理流程

这里我们直接放上完整的流程图

image-1743978874912jpeg 其他模块无足轻重,让我们进入fix_command一探究竟

首先,thefuck会加载配置信息

image-1743978875282.png 配置信息中包含诸多重要的内容

比如与规则相关的

需要排除的规则内容exclude_rules

用户编写的匹配规则存储路径user_dir

随后thefuck将处理know_args,进一步细化数据

得到系统上一次执行的脚本内容command

image-1743978875680.png 并将command传入get_corrected_commands方法

得到纠正的指令

最后将匹配得到的可能的纠正指令通过UI的方式输出

如此就是fuck纠正指令的完整流程

get_corrected_commands是如何工作的

image-1743978876158.png get_corrected_commands内部处理逻辑比较简单

  1. 调用get_rules()方法,获取全部的规则
  2. 传入command(thefuck封装的系统上次执行的命令+命令输出结果等信息),调用rule.is_match方法,判断当前rule是否匹配command
  3. 返回所有可能的rule

说白了,get_corrected_commands就是拿着command匹配所有规则,符合留下,不符合滚犊子

那么匹配规则如何确定呢?

我们看一个demo

def match(command):
    if 'not found' in command.output or 'not installed' in command.output:
        executable = _get_executable(command)
        return not which(executable) and get_package(executable)
    else:
        return False


def get_new_command(command): executable = get_executable(command) name = get_package(executable) formatme = shell.and('sudo apt-get install {}', '{}') return formatme.format(name, command.script)

这是一个叫做apt_get.py的规则文件

他存在两个和新方法,分别是matchget_new_command

在thefuck运行过程中,apt_get.py会被加载到内存,封装为rule对象

在thefuck处理得到command后,会调用match方法,判断command是否匹配apt_get.py规则

如果要匹配,那么command在终端输出的报错信息必须是not found或者not install,这样就说明用户输入指令出现的问题是找不到

如果找不到,就需要给出安装指令

那么新指令如何给出呢?——get_new_command

当thefuck成功匹配apt_get.py规则后,在后续显示fix 指令时,会调用get_new_command方法,给出新的指令

apt_get.py而言,他就负责从command中提取指令信息,最终返回sudo apt get install xxx指令

至此,完成所有的指令纠正功能