您的位置:首页 > 其它

如何打造一个高效的工作环境(一)

2019-03-12 21:45 471 查看

嗨,大家好,我是这个公众号的另一个小编——*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命令行不可比拟的优势。比如:


  • 查看连接你服务器 top10 用户端的 IP 地址:

netstat -nat | awk  '{print  $5}' | awk -F ':' '{print $1}' | sort | uniq -c | sort -rn | head -n 10
  • 查看一下你最常用的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 是一个上古神器,然而,ackhttps://beyondgrep.com/ )、aghttps://github.com/ggreer/the_silver_searcher )和 rghttps://github.com/BurntSushi/ripgrep )是更好的grep,和上面的fd一样,在递归目录匹配的时候,会忽略到你配置在 .gitignore 中的规则。另外,我们会经常玩  command | grep “pattern” 这样的命令,fzfhttps://github.com/junegunn/fzf )会是一个很好用的命令,神器。

  • rm 是一个危险的命令,尤其是各种 rm -rf …,所以,trashhttps://github.com/andreafrancia/trash-cli/ )是一个更好的删除命令。

  • man 命令是好读文档的命令,但是man的文档有时候太长了,所以,你可以试式 tldrhttps://github.com/tldr-pages/tldr )命令,把文档上的一些示例整出来给你看。

  • 如果你想要一个图示化的ping,你可以试试 prettypinghttps://github.com/denilsonsa/prettyping )。

  • 如果你想搜索以前打过的命令,不要再用 Ctrl +R 了,你可以使用 fzfhttps://github.com/junegunn/fzf )你用过就知道有多强了。

  • htop (Installation directions) 是 top 的一个加强版。

  • ncdu (Installation directions) 比 du 好用多了用。另一个选择是 nnn(https://github.com/jarun/nnn )。

  • 如果你想把你的命令行操作建录制成一个 SVG 动图,那么你可以尝试使用 asciinemahttps://asciinema.org/ )和 svg-tremhttps://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 文件中的配置。

关于这些增加命令,参考自下面的这些文章

  1. https://dev.to/_darrenburns/10-tools-to-power-up-your-command-line-4id4

  2. https://dev.to/_darrenburns/tools-to-power-up-your-command-line-part-2-2737

  3. https://dev.to/_darrenburns/power-up-your-command-line-part-3-4o53

  4. https://darrenburns.net/posts/tools/

  5. https://hacker-tools.github.io/


shell 和脚本

shell 是可以与计算机进行高效交互的文本接口。shell 提供了一套交互式的编程语言(脚本),shell的种类很多,比如 shbashzsh 等。

shell 的生命力很强,在各种高级编程语言大行其道的今天,很多的任务依然离不开 shell。比如可以使用 shell 来执行一些编译任务,或者做一些批处理任务,初始化数据、打包程序等等。

写一个脚本很简单,touch zsh-script.sh

#!/bin/zshecho Hello shell

一个脚本就写完了,#!/bin/zsh 表示使用的是哪种 shell。写完之后需要给脚本加上执行的权限:

# 给脚本执行的权限$ chmod +x zsh-script.sh# 执行脚本$ ./zsh-script.sh

脚本的语法很简单,而且可以在脚本中使用命令行的所有命令。还有很多其他有意思的玩法,比如在后台运行:

$ ./zsh-script.sh &

还有可以定时执行,在 crontab 加入:

* * * * * /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 shiftdone

命令行菜单的一个样例:

#!/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";; esacdone

颜色定义,你可以使用 echo -e "${Blu}blue ${Red}red ${RCol}etc...." 进行有颜色文本的输出:

RCol='\e[0m' # Text Reset
# Regular Bold Underline High Intensity BoldHigh Intens Background High Intensity BackgroundsBla='\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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: