您现在的位置是:网站首页>技术百科技术百科

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 命令行允许用户通过组合awksedgrepxargsfindsort等命令,并通过管道将其连接在一起,从而实现复杂功能,尤其在进行简单的数据统计时,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

(注:awksed是两大神器,有兴趣的朋友可以阅读本站的相关教程——《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命令的:

除了原生命令,命令行中还有许多增强工具,能够大幅提升工作效率。以下是一些有趣的命令和工具:

  • fasd:增强了cd命令。
  • bat:增强了cat命令。
  • exa:增强了ls命令。
  • fd:增强了find命令。
  • fzf:文件搜索神器。
  • trash:更安全的删除命令。
  • tldr:简化版man命令。
  • prettyping:图示化的ping命令。
  • hstr:增强版命令历史搜索。
  • htop:增强版的top命令。

这些工具和命令能够帮助你大幅提升命令行操作的效率。如果你想更深入了解命令行的强大功能,可以参考下面的一些文章:

  1. 10 Tools To Power Up Your Command Line
  2. 5 More Tools To Power Up Your Command Line (Part 2)

总结

掌握命令行工具和脚本,合理使用命令和工具,将极大提高程序员的工作效率。通过高效

Shell 和脚本

Shell 是与计算机进行高效交互的文本接口,提供了一种命令行编程语言,允许用户执行一系列任务。常见的 Shell 类型有 shbashzsh 等。

尽管如今高级编程语言盛行,但 Shell 仍然在许多场景下不可替代。比如,在执行编译任务、批处理任务、数据初始化或打包程序时,Shell 都发挥着重要作用。

现在很多开发者喜欢使用 zsh 配合 oh-my-zshzsh-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 命令,如 grepawksed 等,它们是许多系统的默认安装命令。

编写 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脚本时,以下几个索引资源将会对你提供很大的帮助,值得收藏:

阅读完毕,很棒哦!

文章评论

站点信息

  • 网站地址:www.xiaodahan.com
  • 我的QQ: 3306916637