初识shell


事情的初衷是我在测试站点配置时需要不断重复一些步骤,比如deploy三连建站二连,虽然使用终端操控已经很简便了,但是尝试多了之后也会厌烦。于是想到写一个shell脚本来帮助我完成以上的任务,这样的话我每次只要打开终端,按一个小小的up键调用历史命令就可以完成上述任务了。同时这也是我真正意义上第一次接触shell脚本编程

基础配置

在开始写脚本之前还需要进行一些基础的环境配置

新建shell文件夹

这个主要是方便管理shell文件,因为以后肯定还要写的,干脆用一个统一的文件夹存起来好了,我的存储路径是/Users/lizhiyuan/Documents/Shell

将上述文件夹路径添加至环境变量

主要是每次启动终端想要打开shell文件,都需要首先cd到上述路径里,太麻烦了,不如直接添加到环境变量里,这样的话每次只需要在终端里敲shell文件名就可以运行shell文件了

mac下自带的终端是bash,我之前换成了zsh,影响都不大。如果是bash,就打开.bash_profile文件,如果是zsh,就打开.zshrc,然后添加如下代码

1
export PATH=/Users/lizhiyuan/Documents/Shell:$PATH

大意就是将上述路径添加至环境变量,当然我为了懒,还在里面添加了

1
alias shfile="/Users/lizhiyuan/Documents/Shell"

就是将上述路径命了一个别名叫shfile,这样我每次在终端里输入shfile就可以进入上述路径了

当然这里可以一次搞完,再添加一下博客的别名

1
alias blog="/Users/lizhiyuan/Documents/blog"

检验效果

重启终端,直接键入之前的关键词,如blogshfile,如果能直接显示进入路径则表示更改成功,当然也可以通过输入

1
$ PATH

来查看当前环境变量

deploy三连

哈哈这个名字是起着好玩的,实际上就是每次需要把本地hexo博客上传至github或者其他托管的网站上需要的三个步骤,现在我将其简化,只需要一个deploy.sh就可以完成步骤

新建shell文件

在之前的shell文件夹下,新建一个名为deploy.sh(或者其他你认为可以表示这样一个过程的名字)的文件

添加代码

1
2
3
4
5
6
7
8
9
#!/bin/zsh

cd ~/Documents/blog

hexo clean

hexo g

hexo d

其中第一行表示这个文件由zsh来解释,如果你的电脑是bash,就改成#!/bin/bash

赋予权限

如果直接在终端里运行上述文件,终端会提示你没有权限,这个时候我们需要cdshell的根目录下,比如我的电脑就是cd ~/Documents/shell,然后输入chmod +x deploy.sh,权限问题解决

newSite二连

这个问题说实话我还没有很好地解决,目前只是用了一个替代方法。

首先说明这个文件的需要,背景是我每次调试网站时,有些变化需要重新部署环境才能看到的,也就是说我需要

  1. 终止当前hexo serve服务
  2. 查看当前端口4001被什么进程占用了(我默认是用4001,因为4000被node占用了)
  3. kill 上述进程
  4. cd blog目录
  5. hexo serve --port 4001

前三步可以用关掉当前终端来解决,但是用多了之后还是会觉得麻烦,最好是用一个脚本解决上述所有问题,不需要关闭终端,脚本自动找到端口4001占用的进程,并且kill掉上述进程,之后启动serve服务。

问题就出在找到指定端口对应的进程,原来我是采用$ lsof -i:4001来查看,但是这个命令只能log当前进程,我不知道能不能返回当前进程,再加上我对shell的语法不是很熟悉,所以只能在网上寻求帮助,但是搜索一圈之后也无果。后来发现netstat命令也可以实现类似的功能,但是在自己尝试解析netstat时,发现终端似乎无能为力

我目前采取的解决方案是写一个脚本运行上述的4,5步骤,其他的用关闭终端来解决。脚本命名为newSite.sh,内容如下

1
2
3
4
5
#!/bin/zsh

cd ~/Documents/blog

hexo serve --port 4001

以后彻底解决了这个问题再来补充