当有很多个命令行工具时,每一个都添加一个$PATH环境变量有点不优雅。于是首先想到的办法是往固定路径创建软链接,例如:~/.local/bin

但是,很多工具会根据当前工作路径来运行(例如生成配置文件),导致我们必须到工具所在路径下运行。因此我们可以创建脚本并传递命令行的参数来解决这两个问题。

接收命令行参数

手工处理

  • $0 : 在用sh 或者 ./执行脚本时,指的是脚本名,用source或.执行时,永运是bash,这也反应了sh 或者 ./执行脚本的原理和source的方式是不同的.
  • $1 : -v,第一个参数.
  • $2 : -f
  • $3 : -out
  • $4 : /test.log
  • 依次类推 $5 $6 …
  • $# : 参数的个数,不包括命令本身,上例中$#为5.
  • $@ : 参数本身的列表,也不包括命令本身,如上例为 -v -f -out /test.log –prefix=/home
  • $* : 参数本身的列表,也不包括命令本身,但”$*” 和”$@”(加引号)并不同,”$*“将所有的参数解释成一个字符串,而”$@”是一个参数数组。如下例所示:

编写脚本

在固定路径中创建脚本,例如~/.local/bin/xxx

1
2
3
#!/bin/zsh
cd /path/to/program
./program_name $@

这样,就可以实现任意地方调用命令行工具。

第二种方法

~/.zshrc中添加一条别名。如下:

1
alias program_name="cd /path/to/program && ./program_name"

这样就可以了。和第一种的区别是运行结束后会留在程序所在目录。

第三种

其实前面两种还是有问题。

例如第一种,如果参数中有类似./file这样的文件,那么会无法找到文件。

第二种,相同的情况,也会产生类似的结果。

于是最后的办法就是安装autojump(包括oh-my-zsh插件),然后就可以直接j 工具文件夹快速跳转了。

还有更好的解决方案

使用自定义的工具箱,类似于kali的应用菜单,集成,还能方便使用…

例如以下这种开源工具:

ccc-f/PenKitGui: 渗透测试武器库

我还没试过,如果可以的话我可能会用,如果不好用我考虑写一个。就像kali的应用菜单一样最好。

参考文章:

shell - 参数解析三种方式(手工, getopts, getopt) | 面向信仰

⬆︎TOP