我是shell脚本的新手,以下是一个shell脚本:
$JAVA_HOME/bin/java -Dpid=MyJava \
-Xms${HEAP_MIN}m -Xmx${HEAP_MAX}m -cp ${CPG_CLASSPATH} \
-Dconfig=${CFG_FILE} \
-Dcom.test.eps.configpath=${my_config}/ \
-Dcom.test.eps.rt.config=${my_config}/ \
-Dlog4j.configuration=file:///${my_config}/log4j.properties.ewf.rt \
com.test.MyJava &
有人能告诉我上面每一行的代码含义吗?
答案 0 :(得分:4)
$JAVA_HOME/bin/java
- 调用位于当前用户环境中设置的$JAVA_HOME
变量指定的文件夹的bin路径的JRE二进制文件。也就是说,它运行Java,特别是JAVA_HOME指向的版本。
尾随\
是转义字符,它们在行的末尾转义换行符。通常在shell程序中,行末尾的换行符告诉shell你已完成命令,它现在可以解释它。使用\
结束一行告诉shell命令将在下一行实际继续,即这是一个命令。
-Dpid=myJava
- 为值为myJava的名为pid的jre设置系统属性。 Java程序基本上可以在运行时询问getProperty("pid")
,它将返回"myJava"
然后适当地选择它的行为,这是一种配置JRE运行的程序的方法。
-Xms${HEAP_MIN}m
- 将javas min heap size设置为${HEAP_MIN}
env var中的值。堆大小是jre为存储其堆栈跟踪而预留的内存量。
-Xmx${HEAP_MAX}m
- 将Java的最大堆大小设置为${HEAP_MAX}
env var。
-cp ${CPG_CLASSPATH}
- 将Java类路径设置为${CPG_CLASSPATH}
env var。
-Dconfig=${CFG_FILE}
- 为值为$ {CFG_FILE}的名为config的JRE设置系统属性。
-Dcom.test.eps.configpath=${my_config}/
- 为名为com.test.eps.configpath
的JRE设置值为${my_config}
的系统属性。
-Dcom.test.eps.rt.config=${my_config}/
- 为名为com.test.eps.rt.config
的JRE设置值为${my_config}
的系统属性。
-Dlog4j.configuration=file:///${my_config}/log4j.properties.ewf.rt
- 为值为file:///${my_config}/log4j.properties.ewf.rt
的名为log4j.configuration的JRE设置系统属性。
com.test.MyJava
是一个Java类,基本上位于com/test/MyJava.class
的类路径上,可能有一个main
函数。在JRE使用之前设置的所有配置进行初始化之后,它将运行此类并运行其主函数。
&
告诉操作系统在自己的进程中运行此命令,而不是在cli将控制权交还给用户之前等待它返回。它基本上告诉操作系统在一个独立于运行shell的过程中运行该程序。
答案 1 :(得分:1)
答案 2 :(得分:1)
随着shell的发展,那里没有任何本质上复杂的东西;然而,一遍又一遍地有很多相同的东西。
在最高级别,它是一个命令。行末尾的反斜杠继续执行命令,并显示下一行的信息。它调用目录$JAVA_HOME/bin
中的JVM(Java虚拟机,它是JRE的关键组件,Java运行时环境),其中$JAVA_HOME
(我相信你认识),一个shell变量;实际上,它应该是一个环境变量。使用10个参数调用JVM(除非我再次错误计算),并在后台运行(最后是&
)。这意味着shell脚本启动JVM并且不等待它完成。
一些参数还包含shell变量的扩展形式,其中一些可能是环境变量(你不能简单地通过查看它们来确定哪些变量是环境变量,但是传统上,环境变量都是大写的,比如$JAVA_HOME
)。备选表示法${HEAP_MAX}
扩展变量HEAP_MAX
,就像$HEAP_MAX
一样。但是,在那个论点中,你不能(理智地)写:
-Xmx$HEAP_MAXm # Wrong (in this context)
因为它查找变量$HEAP_MAXm
;您使用大括号来分隔变量的名称。您还可以使用大括号中的名称执行许多其他操作,例如${JAVA_HOME:?}
表示如果未设置$JAVA_HOME
,则会生成错误消息并停止脚本。请参阅“参数扩展”手册。
对于JVM参数的含义,您需要查看手册页。但是,作为shell中的练习,其他参数都是已经讨论的内容的变体,使用不同的变量来标识JVM或其运行的程序所需的文件的位置。