开发 Shell 命令

前提

​工作中我们经常遇到很多重复的事情,例如最近我就遇到一个,在debug的时候需要经常到项目里面的logs文件夹下面查看日志,基于这个前提再加上想把之前看linux的一些知识应用一下,写了一个命令,效率倍感提升。

什么是Shell

​虽说这个不需要解释了,但是这里还是要占个位,以便不知道的人,通过这个标题去 baidu google查询自己需要的知识

我一直认同的一个观点,一定要了解程序运行背后的原理,在这里给大家简单介绍一下我个人认为在开发 shell 过程中应该了解的,方便大家理解并记忆,我本人的知识范围有限,有描述不清楚或者不对的地方还请指正。

​我们将在下面通过编写一个实例来进行讲解,目标编写一个自己的命令,这个命令是为了满足我每天 debug 的时候需要查看日志文件


命令、变量、文件

命令

export 在这里您可以理解为设置一个环境变量,例如:export PATH="/usr/local/sbin:$PATH"

source 当你的 .bash_profile 文件变更了,需要用 sorce .bash_profile 重新加载一遍

变量

$PATH 系统环境变量,你可以简单的理解一些目录的集合,通过 echo $PATH 可以看到

$HOME 当前用户的家目录

文件

.bashrc or .bash_profile 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。

你可以在你的终端命令行输入 echo; ls -al; 会进入到你的家目录下面列出所有文件(包括隐藏文件),在不同的类 unix 系统中他们的名字可能不太一样,通常会有一些以 . 开头的文件


shell 如何加载?

我们今天自制一个称为 plogs 的命令 , 当在你的终端输入 plogs 或者任何你想开发的终端命令的时候或许会报出类似如下的错误:

1
command not found: plog

这个错误的原因是终端没有在 $PATH 环境中找到这个命令

另外通常你想要开发一个命令的时候可以用 type [your command] 来检测一下是否存在于系统中, 以免你自己的命令覆盖掉系统的命令, 类似下面,就是检测了系统中是否存在一个 p 命令

1
2
$ type p
p not found

如果这个命令存在,会表现成如下这样子:

1
2
3
4
5
6
7
# rex @ HR in ~ [11:09:22] C:1
$ type ls
ls is an alias for ls -G

# rex @ HR in ~ [11:10:32]
$ type plogs
plogs is /Users/rex/bin/plogs

当你执行 plogs 这个命令的时候的时候系统要去 $PATH 这个目录集合里面挨个去找,有没有一个可执行的命令文件,例如上面就是在 /Users/rex/bin 下面找到了匹配的可执行文件

那如何添加你存放可执行文件的目录放到 $PATH 中呢?你可以在你的 .bash_profile (可能你的系统中叫其他名字) 文件中加上这么一行 $HOME/bin,这样你就可以将你的命令执行文件放在 家目录下面的 bin 目录里面了。

那为什么要放在 bin 目录中呢?因为bin目录通常是类 unix 系统存放可执行文件的地方

Author: rexmolo
Link: http://rexmolo.github.io/2018/07/24/how-to-make-a-shell/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.