您现在的位置是:网站首页>技术百科技术百科
Shell高效工作法
小大寒2024-01-01[技术百科]博学多闻
Shell高效工作法本文介绍了如何通过Shell命令行工具、别名设置、增强工具以及脚本优化程序员的工作效率。重点在于通过命令行简化操作,使用alias提高命令执行效率,以及使用一些增强工具替代传统命令。通过这些方法,程序员能够更高效地完成日常任务。
Shell高效工作法
程序员常被认为是懒惰的群体,他们总是寻求让代码替自己完成繁琐的任务。正是这种思维方式促使他们不断地将日常工作自动化,从而提高效率,使得整个社会的运作变得更加高效。因此,程序员在提升世界效率之前,通常会首先优化自己的工作环境,正所谓“工欲善其事,必先利其器”。
每个程序员都应该打造一套能提升自己工作效率的环境。即便是每次少输入一个命令,少按一次键,减少鼠标与键盘之间的切换,都能够显著提高工作效率。因此,程序员通常需要一台性能优良的计算机,以便在同时运行多个程序或网页时,依旧保持流畅操作。此外,多显示器的配置也能大大提升效率,一个显示器用于编写代码,另一个用于查阅文档,第三个用于测试和查看运行结果,这样就无需在多个窗口之间频繁切换。频繁的窗口切换不仅容易迷失其中,还可能因为不小心而导致错误(例如,区分线上与测试环境时)。
除了硬件的配置,软件方面也能提升程序员的工作效率。其中,命令行与脚本是提升效率的关键工具。与图形化界面相比,鼠标操作往往会让程序员的生产力大打折扣。Unix/Linux Shell就是一个极为强大的工具,功能丰富,几乎无法穷尽。正因如此,才有“Where is the Shell, there is a way”这一说法。
命令行
在不同的操作系统中,都有优秀的命令行工具。例如,在 Mac 系统上可以使用Iterm2,而 Linux 则提供了原生命令行工具。如果你在 Windows 环境下工作,问题也不大,因为 Microsoft 提供了WSL(Windows Subsystem for Linux)。WSL 使得 Windows 系统能够运行 Linux 用户空间,支持诸如 Bash shell、GNU/Linux 命令行工具、编程语言解释器等多种功能,甚至能运行图形化的 Linux 应用。
命令行能够完成大多数日常任务,如创建文件夹(mkdir
)、创建文件(touch
)、移动文件(mv
)、复制文件(cp
)以及删除文件(rm
)等。最强大之处在于,Linux/Unix 命令行允许用户通过组合awk
、sed
、grep
、xargs
、find
、sort
等命令,并通过管道将其连接在一起,从而实现复杂功能,尤其在进行简单的数据统计时,Linux命令行无可匹敌。例如:
- 查看连接到服务器的前10个用户端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
(注:awk
和sed
是两大神器,有兴趣的朋友可以阅读本站的相关教程——《awk简明教程》与《sed简明教程》)。
此外,在命令行中,可以使用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 sock5="ssh -D 8080 -q -C -N -f [email protected]"
你还可以参考以下文章,看看别人是如何巧妙使用alias
命令的:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- What are your favorite bash aliases?
- 23 Handy Bash Shell Aliases For Unix, Linux, and Mac OS X
- A few more of my favorite Bash aliases
除了原生命令,命令行中还有许多增强工具,能够大幅提升工作效率。以下是一些有趣的命令和工具:
- fasd:增强了
cd
命令。 - bat:增强了
cat
命令。 - exa:增强了
ls
命令。 - fd:增强了
find
命令。 - fzf:文件搜索神器。
- trash:更安全的删除命令。
- tldr:简化版man命令。
- prettyping:图示化的ping命令。
- hstr:增强版命令历史搜索。
- htop:增强版的top命令。
这些工具和命令能够帮助你大幅提升命令行操作的效率。如果你想更深入了解命令行的强大功能,可以参考下面的一些文章:
总结
掌握命令行工具和脚本,合理使用命令和工具,将极大提高程序员的工作效率。通过高效
Shell 和脚本
Shell 是与计算机进行高效交互的文本接口,提供了一种命令行编程语言,允许用户执行一系列任务。常见的 Shell 类型有 sh、bash、zsh 等。
尽管如今高级编程语言盛行,但 Shell 仍然在许多场景下不可替代。比如,在执行编译任务、批处理任务、数据初始化或打包程序时,Shell 都发挥着重要作用。
现在很多开发者喜欢使用 zsh 配合 oh-my-zsh 和 zsh-autosuggestions。其中,zsh 和 oh-my-zsh 是常见的配置,而 zsh-autosuggestions 更加高效,能够自动补全命令历史,极大提升命令行操作效率。
另外,fish 是另一款流行的 shell,它提供了自动补全命令、命令高亮等功能,让命令行操作更加流畅。与 oh-my-zsh 类似,fish 在很多方面表现得也十分出色。
你或许认为 Python 脚本或 PHP 脚本比 Shell 更加易于编写且更少 Bug,但我要给出以下两点辩护:
- 第一,当你需要维护线上机器或访问与外网隔离的系统时,可能会发现这些系统没有安装 Python、PHP 或其他高级库,这时 Shell 就显得尤为重要。
- 第二,如果需要频繁与命令行交互,Shell 的表现往往更加高效。举个例子,假设你要在 100 台远程机器上查找 access.log 文件中是否有某个错误,使用 Shell 脚本显然比用 Python 或 PHP 快得多。
因此,我们仍然需要熟悉并善用传统的 POSIX 命令,如 grep、awk、sed 等,它们是许多系统的默认安装命令。
编写 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';
获取当前脚本的绝对路径示例(适用于 Linux):
FILE="$0" while [[ -h ${FILE} ]]; do FILE="`readlink "${FILE}"`" done pushd "`dirname "${FILE}"`" > /dev/null DIR=`pwd -P` popd > /dev/null
如何在远程服务器运行本地脚本:
# 无参数 ssh user@server 'bash -s' < local.script.sh # 有参数 ssh user@server ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
检查一个命令是否存在:
# POSIX 兼容: command -v [the_command] # bash 环境: hash [the_command] type [the_command] # 示例: gnudate() { if hash gdate 2> /dev/null; then gdate "$@" else date "$@" fi }
增强脚本的健壮性,以下是一些常见的技巧:
- 使用
-e
参数,使脚本在遇到错误时停止运行,避免错误蔓延。 - 使用
-u
参数,确保未定义的变量不会造成问题。 - 为变量设置默认值,如
${FOO:-'default'}
。 - 合理处理退出码,便于与其他脚本协同工作。
- 尽量避免使用
;
来执行多个命令,而是使用&&
,这样可以在出错时停止后续命令。 - 为字符串变量加上引号,避免空格或特殊字符导致错误。
- 检查脚本是否带有必要的参数,并能在没有参数时安全运行。
- 为脚本提供
-h
或--help
参数以显示帮助信息。 - 使用
$()
来获取命令输出,易于阅读。 - 跨平台时注意区分不同系统的差异,特别是 MacOS 和 Linux。
- 对于危险操作,如
rm -rf
,务必检查变量是否为空。 - 考虑使用
find | while
替代传统的for
循环。 - 做好防御式编程,先检查文件和目录是否存在。
你还可以通过 ShellCheck 来检查脚本。
更多参考资源:
一些脚本资源网站:
如果你更喜欢框架,以下是一些 Bash 脚本框架:
Google Shell 脚本编码规范:
最后,不要忘记参考这些资源来提升你的 Shell 编程技巧!
在深入学习Shell脚本时,以下几个索引资源将会对你提供很大的帮助,值得收藏:
阅读完毕,很棒哦!