如何打造一个高效的工作环境(一)
嗨,大家好,我是这个公众号的另一个小编——*ray,今天是我在酷壳公众号上发的第一篇文章,感谢皓哥的改稿和内容补充。
程序员是一个很懒的群体,总想着能够让代码为自己干活,他们不断地把工作生活中的一些事情用代码自动化了,从而让整个社会的效率运作地越来越高。所以,程序员在准备去优化这个世界的时候,都会先要优化自己的工作环境,是所谓“工欲善其事,必先利其器”。
我们每个程序员都应该打造一套让自己更为高效的工作环境。那怕就是让你少输入一次命令,少按一次键,少在鼠标和键盘间切换一次,都会让程序员的工作变得更为的高效。所以,程序员一般需要一台性能比较好,不会因为开了太多的网页或程序就卡得不行的电脑,还要配备多个显示器,一个显示器写代码,一个查文档,一个测试运行结果,而不必在各种窗口来来回回的切换……在大量的窗口间切换经常会迷路,而且也容易出错(分不清线上或测试环境)……
除了硬件上的装备,软件上也是能够得升程序员生产力的地方,下面我们就想在软件层面说一下可以提升程序员生产力的一些东西。
这篇文章在查阅了很多资料以及结合自身的实践,从四个方面来说明如何打造一套适合自己的工具,分别是命令行篇、shell和脚本篇、编辑器篇、版本管理篇。
这篇文章篇幅太长,拆分为两篇,这篇内容关于命令行和 shell。
命令行篇
一个好的、可定制的命令行环境可以给工作效率带来很大的提升。如果你还在使用这个,那就差点意思了:
在不同的操作系统下,都有着很不错的命令行工具,比如 Mac 下的 Iterm2,Linux 下的原生命令行,如果你是在 Windows 下工作,问题也不大,因为 Windows 下现在有了 WSL。WSL 提供了一个由微软开发的Linux兼容的内核接口(不包含Linux内核代码),然后可以在其上运行GNU用户空间,例如 Ubuntu,openSUSE,SUSE Linux Enterprise Server,Debian和Kali Linux。这样的用户空间可能包含 Bash shell 和命令语言,使用本机 GNU/Linux 命令行工具(sed,awk 等),编程语言解释器(Ruby,Python 等),甚至是图形应用程序(使用主机端的X窗口系统)。
使用命令行可以完成所有日常的操作,新建文件夹(mkdir)、新建文件(touch)、移动(mv)、复制(cp)、删除(rm)等等。而且使用 Linux/Unix 命令行最好的方式是可以用 awk、sed、grep、xargs、find、sort 等等这样的命令,然后用管道把其串起来,就可以完成一个你想要的功能,尤其是一些简单的数据统计功能。这是Linux命令行不可比拟的优势。比如:
netstat -nat | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c | sort -rn | head -n 10
cat .bash_history | sort | uniq -c | sort -rn | head -n 10 (or cat .zhistory | sort | uniq -c | sort -rn | head -n 10
在命令行中使用 alias 可以将使用频率很高命令或者比较复杂的命令合并成一个命令,或者修改原生的命令。
下面这几个命令,可能是你天天都在敲的。所以,你应该设置成 alias 来提高效率:
alias nis="npm install --save "
alias svim='sudo vim'
alias mkcd='foo(){ mkdir -p "$1"; cd "$1" }; foo '
alias install='sudo apt get install'
alias update='sudo apt-get update && sudo apt-get upgrade'
alias ..="cd .."
alias ...="cd ..; cd .."
alias www='python -m SimpleHTTPServer 8000'
你还可以参考如下的一些文章,看看别人是怎么用好 alias
的
https://www.cyberciti.biz/tips/bash-aliases-mac-centos-linux-unix.html
https://www.digitalocean.com/community/questions/what-are-your-favorite-bash-aliases
https://www.linuxtrainingacademy.com/23-handy-bash-shell-aliases-for-unix-linux-and-mac-os-x/
https://brettterpstra.com/2013/03/31/a-few-more-of-my-favorite-shell-aliases/
命令行中除了原生的命令之外,还有很多可以提升使用体验的工具。下面罗列一些很不错的命令,把原生的命令增强地很厉害:
fasd 增强了 cd 命令 (https://github.com/clvv/fasd )。
bat 增强了 cat 命令 (https://github.com/sharkdp/bat )。
exa 增强了 ls 命令(https://github.com/ogham/exa ),如果你需要在很多目录上浏览各种文件 ,ranger 命令可以比 cd 和 cat 更有效率(https://github.com/ranger/ranger ),甚至可以在你的终端预览图片。
fd 是一个比
find
更简单更快的命令(https://github.com/sharkdp/fd ),他还会自动地忽略掉一些你配置在.gitignore
中的文件,以及.git
下的文件。grep
是一个上古神器,然而,ack(https://beyondgrep.com/ )、ag (https://github.com/ggreer/the_silver_searcher )和 rg(https://github.com/BurntSushi/ripgrep )是更好的grep,和上面的fd一样,在递归目录匹配的时候,会忽略到你配置在 .gitignore 中的规则。另外,我们会经常玩command | grep “pattern”
这样的命令,fzf(https://github.com/junegunn/fzf )会是一个很好用的命令,神器。rm
是一个危险的命令,尤其是各种rm -rf …
,所以,trash(https://github.com/andreafrancia/trash-cli/ )是一个更好的删除命令。man
命令是好读文档的命令,但是man的文档有时候太长了,所以,你可以试式 tldr(https://github.com/tldr-pages/tldr )命令,把文档上的一些示例整出来给你看。如果你想要一个图示化的
ping
,你可以试试 prettyping (https://github.com/denilsonsa/prettyping )。如果你想搜索以前打过的命令,不要再用 Ctrl +R 了,你可以使用 fzf (https://github.com/junegunn/fzf )你用过就知道有多强了。
htop (Installation directions) 是 top 的一个加强版。
ncdu (Installation directions) 比 du 好用多了用。另一个选择是 nnn(https://github.com/jarun/nnn )。
如果你想把你的命令行操作建录制成一个 SVG 动图,那么你可以尝试使用 asciinema (https://asciinema.org/ )和 svg-trem (https://github.com/marionebl/svg-term-cli )。
httpie(https://github.com/jakubroztocil/httpie) 是一个可以用来替代 curl 和 wget 的 http 客户端,httpie 支持 json 和语法高亮,可以使用简单的语法进行 http 访问:
http -v github.com
。tmux 在需要经常登录远程服务器工作的时候会很有用,可以保持远程登录的会话,还可以在一个窗口中查看多个 shell 的状态。
Taskbook(https://github.com/klaussinani/taskbook) 是可以完全在命令行中使用的任务管理器 ,支持 ToDo 管理,还可以为每个任务加上优先级。
sshrc (sshrc:https://github.com/Russell91/sshrc ) 是个神器,在你登录远程服务器的时候也能使用本机的 shell 的 rc 文件中的配置。
关于这些增加命令,参考自下面的这些文章
https://dev.to/_darrenburns/10-tools-to-power-up-your-command-line-4id4
https://dev.to/_darrenburns/tools-to-power-up-your-command-line-part-2-2737
https://dev.to/_darrenburns/power-up-your-command-line-part-3-4o53
https://darrenburns.net/posts/tools/
https://hacker-tools.github.io/
shell 和脚本
shell 是可以与计算机进行高效交互的文本接口。shell 提供了一套交互式的编程语言(脚本),shell的种类很多,比如 sh、bash、zsh 等。
shell 的生命力很强,在各种高级编程语言大行其道的今天,很多的任务依然离不开 shell。比如可以使用 shell 来执行一些编译任务,或者做一些批处理任务,初始化数据、打包程序等等。
写一个脚本很简单,touch zsh-script.sh:
#!/bin/zsh
echo Hello shell
# 给脚本执行的权限
$ chmod +x zsh-script.sh
# 执行脚本
$ ./zsh-script.sh
脚本的语法很简单,而且可以在脚本中使用命令行的所有命令。还有很多其他有意思的玩法,比如在后台运行:
$ ./zsh-script.sh &
* * * * * /home/ray/zsh-script.zsh
crontab 是 Linux 中的一个定时器,可以定制执行任务,上面的表示每分钟执行一次脚本。
我最喜欢的就是 zsh + oh-my-zsh + zsh-autosuggestions 的组合,你也可以试试看。其中 zsh 和 oh-my-zsh 算是常规操作了,但是 zsh-autosuggestions 特别有用,可以超级快速的帮你补全你输入过的命令,让命令行的操作更加高效。
你也许会说,用 Python 脚本或 PHP 来写脚本会比 Shell 更好更没有 bug,但是还是那句话:
其一,如果你有一天要维护线上机器的时候,或是到了银行用户的系统(与外网完全隔离,而且服务器上没有安装 Python/PHP 或是他们的的高级库,那么,你只有 Shell 可以用了)。
其二,而且,如果跟命令交互很多的话,Shell 是不二之选,试想一下,如果你要去 100 台远程的机器上查access.log 日志中有没有某个错误,完成这个工作你是用 PHP/Python 写脚本快还是用 Shell 写脚本快呢?
要写好一个脚本并不容易,下面有一些小模板供你参考:
处理命令行参数的一个样例:
while [ "$1" != "" ]; do
case $1 in
-s ) shift
SERVER=$1 ;;
-d ) shift
DATE=$1 ;;
--paramter|p ) shift
PARAMETER=$1;;
-h|help ) usage # function call
exit ;;
* ) usage # All other parameters
exit 1
esac
shift
done
命令行菜单的一个样例:
#!/bin/bash
# Bash Menu Script Example
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 3")
echo "you chose choice $REPLY which is $opt"
;;
"Quit")
break
;;
*) echo "invalid option $REPLY";;
esac
done
RCol='\e[0m' # Text Reset
# Regular Bold Underline High Intensity BoldHigh Intens Background High Intensity Backgrounds
Bla='\e[0;30m'; BBla='\e[1;30m'; UBla='\e[4;30m'; IBla='\e[0;90m'; BIBla='\e[1;90m'; On_Bla='\e[40m'; On_IBla='\e[0;100m';
Red='\e[0;31m'; BRed='\e[1;31m'; URed='\e[4;31m'; IRed='\e[0;91m'; BIRed='\e[1;91m'; On_Red='\e[41m'; On_IRed='\e[0;101m';
Gre='\e[0;32m'; BGre='\e[1;32m'; UGre='\e[4;32m'; IGre='\e[0;92m'; BIGre='\e[1;92m'; On_Gre='\e[42m'; On_IGre='\e[0;102m';
Yel='\e[0;33m'; BYel='\e[1;33m'; UYel='\e[4;33m'; IYel='\e[0;93m'; BIYel='\e[1;93m'; On_Yel='\e[43m'; On_IYel='\e[0;103m';
Blu='\e[0;34m'; BBlu='\e[1;34m'; UBlu='\e[4;34m'; IBlu='\e[0;94m'; BIBlu='\e[1;94m'; On_Blu='\e[44m'; On_IBlu='\e[0;104m';
Pur='\e[0;35m'; BPur='\e[1;35m'; UPur='\e[4;35m'; IPur='\e[0;95m'; BIPur='\e[1;95m'; On_Pur='\e[45m'; On_IPur='\e[0;105m';
Cya='\e[0;36m'; BCya='\e[1;36m'; UCya='\e[4;36m'; ICya='\e[0;96m'; BICya='\e[1;96m'; On_Cya='\e[46m'; On_ICya='\e[0;106m';
Whi='\e[0;37m'; BWhi='\e[1;37m'; UWhi='\e[4;37m'; IWhi='\e[0;97m'; BIWhi='\e[1;97m'; On_Whi='\e[47m'; On_IWhi='\e[0;107m';
下面推荐一些 Shell 和脚本的参考资料。
各种有意思的命令拼装,一行命令走天涯:
http://www.bashoneliners.com/
http://www.shell-fu.org/
http://www.commandlinefu.com/
下面是一些脚本集中营,你可以在里面淘到各种牛X的脚本:
http://www.shelldorado.com/scripts/
https://snippets.siftie.com/public/tag/bash/
https://bash.cyberciti.biz/
https://github.com/alexanderepstein/Bash-Snippets
https://github.com/miguelgfierro/scripts
https://github.com/epety/100-shell-script-examples
https://github.com/ruanyf/simple-bash-scripts
甚至写脚本都可以使用框架:
写bash脚本的框架 https://github.com/Bash-it/bash-it
最后,别忘了几个和shell有关的索引资源:
https://github.com/alebcay/awesome-shell
https://github.com/awesome-lists/awesome-bash
https://terminalsare.sexy/
happy hacking!
(完)
本人喜欢折腾,大学期间曾创业三年,明白自己的不足后目前专心搬砖,在等待下一次机会,本人长期可撩。
Blog: http://www.rayjun.cn/
Email: rayjun0412@gmail.com
Github: https://github.com/rayjun
- 如何打造一个高效的工作环境(二)
- 如何配置一个高效的 Mac 工作环境
- 如何配置一个高效的 Mac 工作环境
- 如何配置一个高效的 Mac 工作环境
- 强迫症的 Mac 设置指南,如何配置一个高效的 Mac 工作环境
- 收藏-如何配置一个高效的 Mac 工作环境
- Python web框架Django学习(1)——在win7 64bit下配置开发环境Django:一个可以使Web开发工作愉快并且高效的Web开发框架。 使用Django,使你能够以最小的代价构建和
- 打造高效前端工作环境-tmuxinator
- 一个工程师该如何高效工作
- 领导者如何打造一个高效团队
- 高效工程师系列(一) 如何找到一个利于自己成长的环境
- 如何给自己创造一个快乐的工作环境
- 打造高效的工作环境
- 打造高效前端工作环境-tmuxinator
- 打造高效前端工作环境_-_tmux
- 如何打造一个高效的测试团队
- 打造高效前端工作环境 - tmux
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 如何建立一个 XML 的开发环境
- 打造一个无干扰的写作环境