通常在 Linux 服务器上会遇到在命令行中输入命令的操作,而有些操作包含的命令数目较多或者其中的命令包含的参数较多,如果一个一个的敲命令的话就太麻烦了,有几种做法可以简化操作:
使用 alias 为命令编写别名,比如我之前开发一个网站程序 minor-sspymgr 时,经常需要上传修改后的代码,更新服务器上的代码,重启网站程序。为了方便,我定义一个 alias 别名命令:
alias updateMgr='cd ~/minor-sspymgr/ && git pull origin master && pm2 restart sspymgr'这种方法的优点是很方便简单,把常用的命令组合到一起,用一个别名表示即可使用。当然,它的缺点也很明显,就是不能执行一些复杂的命令,而且难以将参数应用到命令中。
编写一个 .sh 脚本,我之前写简单脚本时用的都是 bash,对于上述例子,用 sh 脚本编写起来也很类似,可以简单的把上述命令以 && 拆分为 3 行:
#!/bin/bash cd ~/minor-sspymgr/ git pull origin master pm2 restart sspymgr当然了,实际的脚本远非如此简单,可以用 $1 ... $n 获取命令行参数,执行一些更复杂的逻辑。
为什么用 Python 写脚本既然用 bash 已经可以编写一些脚本了,那么为什么我还要用 Python 编写脚本呢?原因有两个:1. bash 用的不多,学的也早,而且 bash 和常用的编程语言的语法有些差别,很多内容都容易忘记,用 Python 写的话也可以熟悉 Python(尽管我是从 flask 制作一个 WSGIServer 开始使用 Python 的),2. Python 的库很多也很方便使用,编写脚本给人一种流畅的感觉。当然最主要的原因就是因为 Python 里面有 argparse 这个库,对于解析命令行参数来说十分方便。
如何解析命令行参数bash 脚本里面获取命令行参数的方式很简单,但是解析起来却比较麻烦,如果有 bash 解析命令行参数的库,希望可以推荐给我。不过即使有这样的库,估计我还是会选择 Python 来编写脚本了。在 Python 里解析命令行参数的模块比较多,有 getopt、optparse、argparse 等 1。目前我只用过 argparse,因此这里也只会涉及到如何用 argparse 来解析命令行参数。至于前两个模块,如果有兴趣的话,可以自行了解。argparse 使用起来非常简单:
from argparse import ArgumentParser parser = ArgumentParser(description="""Run this script under SUPER USER privilege. Create or remove git repository under direcotry: {}. Currently only works for Linux. Most operations are only tested under Linux. Script version : {}. """.format(config["repo_dir"], __version__)) parser.add_argument("-V", "--version", help="Print this script version", action="store_true") args = parser.parse_args() if args.version: print("Script version is {}".format(__version__))上面这几行代码就做好了一个简单的命令行解析功能,当我们输入 script.py -V 的时候就会打印出脚本的版本。不需要在意命令行参数的位置或者是否必须要加上这个参数,只需要将注意力放在代码的逻辑上即可,argparse 这个模块可以极大的方便我们解析命令行参数。
示例:初始化 git 仓库的脚本之前用 git 搭建过源代码管理服务器 2、3。如果要在这样的服务器上添加一个共享仓库,就需要在仓库根目录下面执行一些操作了。比如说,我的 git 仓库存放的目录是 /src 这个目录下面的所有文件及文件夹的属主和属组都是 git,要想新建一个共享仓库,最开始我的做法是:
cd /src
mkdir newrepo && cd newrepo
git init --bare --shared
cd ..
sudo chown -R git:git newrepo && sudo chmod -R g+rwx newrepo
步骤还是有点多的,每次都要敲这么多命令很麻烦,把这些命令写到 bash 脚本中,比如叫做 gitrepo.sh,给它加上 x 执行权限,在终端里输入 sudo gitrepo.sh reponame 就能完成上面的操作。
用 Bash 编写的脚本Bash 脚本,编写简单,就是把在命令行中敲过的命令依次写到文件中即可,但是对于不常写 bash 脚本的我来说,要编写一个完备的脚本,并且要包含参数、异常处理等逻辑来说比较麻烦:
#!/bin/bash # filename: gitrepo.sh # @author BriFuture # @details create bare and shared repository within /src directory repoName=$1 if [ -z "$repoName" ]; then echo "Repo is empty!" exit 1 fi dotpos=`expr index "$repoName" "."` if [ "$dotpos" -gt 0 ]; then echo "found"; else repoName=$repoName".git" fi # go to the repository dir cd /src mkdir $repoName cd $repoName echo "Init git repo in $repoName" git init --bare --shared # change the own of repository cd ../ sudo chown -R git:git $repoName sudo chmod -R g+rwx $repoName 用 Python 编写的脚本实际上,我用 Python 重新编写这个脚本时,在参数中加入了更多的可选项,此前的 bash 脚本只能够添加仓库,这个全新的脚本加入了其他操作:添加新的仓库,列出所有仓库,删除一个仓库。并且完善了命令行的帮助信息,为脚本添加了配置文件以及输出日志。