thefuck是如何帮助你提高命令行效率
文章目录
- the fuck是什么
- 如何安装
- 原理
- 模块划分
- 模块介绍
- 处理流程
- get_corrected_commands是如何工作的
99% 的人都不知道的: 命令行竟然存在 fuck 命令!功能强大
the fuck是什么
thefuck是开源的命令行纠错工具,可以用于纠正执上一条执行错误的指令
常用Linux的小伙伴可能会遇到这样的问题,在输入指令时总是因为忘了添加sudo
导致权限不足无法执行
如果指令很长,又忘了Linux光标跳转快捷键,就不得不猛敲键盘手动添加sudo
如果安装thefuck,只需对着键盘一顿fuck
正确的指令就会显示在终端
此外,thefuck还可以自动帮你输出安装工具
如果shell在执行时发现指令不存在
此时只需输入fuck
终端就会显示相应的纠正指令
如何安装
既然fuck这么好用,那我该怎么安装呢?
thefuck支持多个操作系统
但不管是你使用的Mac,Linux,还是Windows
他们仨使安装过程都大同小异
下载python环境(大于3.5.0),安装thefuck,配置别名
首先是Windows
打开powershell
输入pip install thefuck
安装thefuck
随后在powershell的配置文件中写入如下两条指令
$env:PYTHONIOENCODING="utf-8"
iex "$(thefuck --alias)"
重启powershell,即可完成配置
此时你可能会感到疑惑,powershell的配置,这是啥?我没有啊
没关系,只需短短三行指令,1秒解决你的疑惑
打开powershell,输入如下三条指令
echo $profile
Test-Path $profile
New-Item -Path $profile -Type File –Force
在资源管理器中进入目录:C:\Users\<用户名>\Documents\WindowsPowerShell
会发现目录下多出了Microsoft.PowerShell_profile.ps1文件
这就是powershell的配置信息
每次powershell打开前都会加载该文件
其次是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的别名
退出.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,先放简化流程图
模块划分
抛开和不同操作系统交互的模块,聚焦于更核心的逻辑
从宏观上,thefuck可以分为三大模块
解析器,流程控制模块,不同分支处理模块
分支处理继续细分,可得到help打印,版本打印,指令纠正等等
模块介绍
解析器Parser,负责读取上一条用户输入的指令
并通过调用parse()方法将指令处理为系统可识别的对象
know_args
之后,流程控制模块将根据know_args中
不同的数据信息进行不同的分支处理
譬如打印帮助文档
打印版本
打印别名
还有最重要的指令纠正,fix_command
处理流程
这里我们直接放上完整的流程图
其他模块无足轻重,让我们进入fix_command一探究竟
首先,thefuck会加载配置信息
配置信息中包含诸多重要的内容
比如与规则相关的
需要排除的规则内容exclude_rules
用户编写的匹配规则存储路径user_dir
随后thefuck将处理know_args,进一步细化数据
得到系统上一次执行的脚本内容command
并将command传入get_corrected_commands方法
得到纠正的指令
最后将匹配得到的可能的纠正指令通过UI的方式输出
如此就是fuck纠正指令的完整流程
get_corrected_commands是如何工作的
get_corrected_commands
内部处理逻辑比较简单
- 调用get_rules()方法,获取全部的规则
- 传入
command
(thefuck封装的系统上次执行的命令+命令输出结果等信息),调用rule.is_match
方法,判断当前rule
是否匹配command - 返回所有可能的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
的规则文件
他存在两个和新方法,分别是match
和get_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
指令
至此,完成所有的指令纠正功能