如何将参数从包装外壳脚本传递给Java应用程序?


问题内容

我想运行在命令行(Linux和Mac)上创建的Java程序。我不想一直输入“
java”和参数,因此我正在考虑创建包装器脚本。使它们无处不在的最佳方法是什么?我也希望能够传递参数。我当时正在考虑使用“
shift”执行此操作(删除第一个参数)。

有没有一种更好的方法可以完全不使用脚本呢?也许制作一个不需要通过“ java”命令调用的可执行文件?


问题答案:

假设您使用的是与Bourne外壳兼容的外壳;例如sh,bash,ksh等,以下包装器会将所有命令行参数传递给java命令:

#!/bin/sh
OPTS=... 
java $OPTS com.example.YourApp "$@"

$@周围引起的参数为shell脚本其余的参数,并把报价膨胀进行单独报价,这样下将传递一个参数到Java:

$ wrapper "/home/person/Stupid Directory Name/foo.txt"

"$@"在包装脚本中没有双引号的情况下,Java将收到上述三个参数。


请注意,这不适用于"$*"。根据bash手动输入:

"$*" 等价于"$1c$2c...",其中cIFS变量值的第一个字符。

换句话说,所有shell参数将被合并为Java应用程序的单个命令参数,而忽略原始单词边界。

有关外壳如何处理引用的更多信息,请参考bashsh手册…或POSIX Shell规范…。