logo

鱼肚的博客

Don't Repeat Yourself

使用npm管理常用shell脚本

npm一般被用作管理Javascript相关的模块,它同时也提供了『bin』的功能,即安装某模块之后,自动在系统中设置命令行工具。

所以我们就可以拿它来管理命令行工具。

因为npm只特殊对待头部带有#!/usr/bin/env node的脚本,将其转为Node运行。其它的都是直接执行,所以我们就可以随便放一些Shell脚本、Perl脚本甚至二进制包到它的里面,并将其作为一个安装工具来使用。

以一个简单的命令 du -sh * | sort -rh为例,因为我经常记不住这个命令,所以想抽取一个别名dusort。虽然只需要在shell配置中加个函数或别名就好了,但是这样不方便同步和分享。

像这种情况,我们就可以写一个简单的npm包来实现便捷的安装和分发了。

首先,写一个脚本 dusort.sh

1#!/bin/sh
2du -sh * | sort -rh

再给其加上可执行权限:

1chmod a+x ./dusort.sh

再n初始化一个npm包

npm init

得到一个如下的package.json文件

1{
2  "name": "dusort",
3  "version": "1.0.0",
4  "description": "du -sh * | sort -rh",
5  "main": "index.js",
6  "scripts": {
7    "test": "echo \"Error: no test specified\" && exit 1"
8  },
9  "repository": {
10    "type": "git",
11    "url": "git+https://github.com/banyudu/dusort.git"
12  },
13  "author": "",
14  "license": "ISC",
15  "bugs": {
16    "url": "https://github.com/banyudu/dusort/issues"
17  },
18  "homepage": "https://github.com/banyudu/dusort#readme"
19}
20

在它的内部添加一个bin配置:

1{
2  "bin": {
3    "dusort": "./dusort.sh"
4  }
5}

最后执行

1npm publish

命令进行发布

这样就搞定了。

使用的时候,既可以免安装执行:

1npx dusort

也可以先安装再执行

1npm i -g dusort
2dusort

一个方便易用的命令就配置完成了。