Shell 命令行扩展:The Fuck
开发者都或多或少接触过 linux 接触过命令行,当然肯定也都被命令行狠狠地“fuck”过。我很多时候都是微不足道的原因导致了命令行出错,例如将 python 输入成 ptyhon,例如将ls -alh输入成ls a-lh而导致出错,这个时候我会想说:“fuck”。
起源
开发 thefuck 的这位同仁,恐怕也经常会有这种不和谐的情况。因此开发了这个软件 thefuck。
thefuck 不仅仅能修复字符输入顺序的错误,在很多别的你想说“fuck”的情况下,thefuck 依然有效。
例如以下情况。
案例
任何情况下你想说“我操”,你都可以用得到 thefuck。
例如:
ls 和 sl
使用过 ubuntu 的开发者很多都知道有这么一条命令:sl。这条命令是在你将 ls 错误地输成 sl 时,会在屏幕上快速驶过一辆火车。当然,有了 thefuck,sl 似乎也可以退休了。
➜ sl The program 'sl' is currently not installed. You can install it by typing: sudo apt-get install sl ➜ fuck ls #修正 a.go b.php dockerui jekyll-casper main.go PureBlog sss.png typecho a.php c-hash Font-Awesome jekyll-pure mili signal.c TeamTalk upload bii-ubuntu-64_3_0.deb Dockerfile harmony JekyllPure ngircd signal.c~ tingyun-agent-php-latest.x86_64.deb web.goblog Dockerfile.bak hashmap kasper php-src sss.jpg tipi zerver
忘记 sudo
➜ 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
操作 git
➜ git pushfatal: 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 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 Python 3.4.2 (default, Oct 8 2014, 13:08:17) ...
选项修正
➜ git brnchgit: 'brnch' is not a git command. See 'git --help'. Did you mean this? branch ➜ fuck git branch * master
其他
thefuck 还有其他很多种用法,就等着你去发现。
安装
安装需求
-
python (2.7+ or 3.3+)
-
pip
-
python-dev
安装方法
-
可以使用 pip 安装:sudo pip install thefuck
或者使用 OS X、Ubuntu、Arch 的包管理器安装。 -
安装后配置
bash:alias fuck='eval $(thefuck $(fc -ln -1)); history -r'
Zsh、Fish 和 PowerShell 的 配置方法见这里。
更新
更新到最新的 thefuck 的方法非常简单:
sudo pip install thefuck --upgrade
其他
软件原理
前面说了那么多用法,
那么有人觉得 thefuck 可能只是一个用来
thefuck 进行命令修复的模块名和对应的修复原理如下:
-
brew_unknown_command:修复brew命令,例如将brew docto修复为brew doctor
-
cd_parent:将cd..修正为cd ..
-
cd_mkdir:cd进入不存在的目录时尝试创建目录。
-
cp_omitting_directory:cp时添加-a选项
-
fix_alt_space:将所有的的Alt+Space修正为Space。
-
git_add:修正没有git add的情况。
-
git_checkout:git checkout不存在的分支之前尝试创建分支。
-
git_no_command:修正错误的选项,例如git brnch。
-
git_push:如果push失败,尝试将git push修正为git push --set-upstream origin $branch。
-
has_exists_script:为所有的提示不存在的命令尝试添加./前缀。
-
lein_not_task:修正lein,例如lein rpl。
-
mkdir_p:mkdir时尝试添加-p选项。
-
no_command:修正不存在的命令,例如vom修正为vim。
-
man_no_space:将没有空格的man命令添加空格,例如mandiff修正为man diff
-
pacman:arch 系统上,如果使用没有安装的软件,尝试使用pacman或者yaourt安装。
-
pip_unknown_command:修正错误的pip命令,例如pip isntall修正为pip install
-
python_command:当前目录试图执行没有x权限的 python 程序时,修复为添加python前缀
-
sl_ls:sl修正为ls
-
rm_dir:如果删除文件夹,为rm添加-rf选项。
-
ssh_known_hosts:如果远程主机公钥不匹配,尝试将远程主机公钥从know_hosts中移除。
-
sudo:如果提示没有权限,尝试添加sudo。
-
switch_layout:将键盘布局修正为英语布局。
-
apt_get:如果不存在命令,尝试使用apt-get包管理器安装。
-
brew_install:修正brew install的格式。
-
composer_not_command:修正 composer 命令。
没有启用的模块:
-
ls_lah:为ls添加-alh选项。
-
rm_root:为rm -rf /添加--no-preserve-root选项。
自定义规则
当然,你也可以自定义修正规则:
一个自定义规则的案例:
def match(command, settings): return ('permission denied' in command.stderr.lower() or 'EACCES' in command.stderr)# 获取 stderr 中的字符串和程序返回值(errno),# 修正规则(命令前添加 sudo)def get_new_command(command, settings): return 'sudo {}'.format(command.script)# 以下为可选项# 默认是否开启enabled_by_default = True# 附加命令def side_effect(command, settings): subprocess.call('chmod 777 .', shell=True)# 优先级,数字越大优先级越低。priority = 1000
使用须知
虽然 thefuck 带来了很多便利,不过仍然建议注意这件事情:
thefuck 会给出的修正后的命令,但是默认情况下你看到它们的时候,命令都已经默认执行了。
大部分情况下,thefuck 可能给出的是正确的修正,但是小部分情况下,给出的修正并不是你想要的。
所以建议将~/.thefuck/settings.py中的设置改为require_confirmation = True,这样可以自己决定是否执行修正后的命令。
介绍内容来自 segmentfault