基于Java版本运行不同的Bash命令
我正在尝试为一个Java项目开发一个bash构建脚本,该项目将在Ubuntu和Fedora上运行。Ubuntu使用gcj编译器,而Fedora使用IcedTea 两者报告错误和警告的方式略有不同,我想忽略这些警告(我知道,这通常不是一个好主意,但有些警告只是白痴) 对于gcj,我想运行:基于Java版本运行不同的Bash命令,java,bash,gcj,Java,Bash,Gcj,我正在尝试为一个Java项目开发一个bash构建脚本,该项目将在Ubuntu和Fedora上运行。Ubuntu使用gcj编译器,而Fedora使用IcedTea 两者报告错误和警告的方式略有不同,我想忽略这些警告(我知道,这通常不是一个好主意,但有些警告只是白痴) 对于gcj,我想运行: javac *.java 2>&1 | grep -A 4 "error:" javac *.java 2>&1 | grep -A 4 "error:\|errors\|.jav
javac *.java 2>&1 | grep -A 4 "error:"
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
但对于IcedTea,我想运行:
javac *.java 2>&1 | grep -A 4 "error:"
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
我对bash还是新手,那么我该如何编写一个if语句,根据javac版本分别运行一个和另一个呢
#!/bin/sh
JAVAC_VERSION="`java -version 2>&1 /dev/null | awk '/IcedTea/ {print $4}' | sed -e 's/[\(0-9]//g'`"
ICEDTEA="IcedTea"
if [ ${JAVAC_VERSION} = ${ICEDTEA} ]; then
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
else
javac *.java 2>&1 | grep -A 4 "error:"
fi
exit 0
如果我没弄错你的问题的话,那就行了。您是如何获得版本的?我不太确定,但是如果我的javac-version
不正确,请根据您的需要进行相应的更改
如果我没弄错你的问题的话,那就行了。如何获得版本-我不太清楚,但是如果我的
javac-version
不正确,请根据您的需要进行相应的更改。假设您的java和javac二进制文件匹配,并且icedtea是特例
#!/bin/bash
ERROR="error:"
java -version 2>&1 | grep -i icedtea > /dev/null
if [ $? -eq 0 ]; then
ERROR="error:\|errors\|.java:"
fi
javac *.java 2>&1 | grep -A 4 $ERROR
在我的系统上,icedtea和sun对“javac-version”有相同的输出,但对“java-version”没有相同的输出。假设您的java和javac二进制文件匹配,并且icedtea是特例
#!/bin/bash
ERROR="error:"
java -version 2>&1 | grep -i icedtea > /dev/null
if [ $? -eq 0 ]; then
ERROR="error:\|errors\|.java:"
fi
javac *.java 2>&1 | grep -A 4 $ERROR
在我的系统上,icedtea和sun对“javac-version”具有相同的输出,但对“java-version”没有相同的输出。用bash(或任何其他shell语言)编写java构建脚本有许多问题:
- 由于shell差异、不同的命令位置、不兼容的命令选项等原因,脚本往往不可移植。。。即使你想让手机便携
- 脚本无法处理依赖关系(或者至少不容易)
- 脚本无法处理仅重新编译已更改的内容
相反,我建议您编写一个“build.xml”文件并使用。Ant的优点是可以在运行Java的任何构建平台上运行,并且能够处理绝大多数平台差异。它有点像是专门为构建Java而设计的更好的“Make”。用bash(或任何其他shell语言)编写Java构建脚本有很多问题:
- 由于shell差异、不同的命令位置、不兼容的命令选项等原因,脚本往往不可移植。。。即使你想让手机便携
- 脚本无法处理依赖关系(或者至少不容易)
- 脚本无法处理仅重新编译已更改的内容
相反,我建议您编写一个“build.xml”文件并使用。Ant的优点是可以在运行Java的任何构建平台上运行,并且能够处理绝大多数平台差异。这有点像是专门为构建Java而设计的更好的“Make”。这很接近,但我在第二条if语句中得到了错误“[:javac:binary operator expected”。此外,如果我在第一行后面放一个“echo$javac_VERSION”,它什么也没有显示。已确认,让我试试。这很接近,但我得到了错误”[:javac:binary operator expected”出现在第二条if语句中。另外,如果我在第一行后面放一个“echo$javac_VERSION”,它什么也不显示。已确认,让我试试。投票,好的版本&简单(我喜欢),效果很好。投票,好的版本&简单(我喜欢)而且工作得很好。-1 XML在某种程度上比Makefile好?ant是一种搜索问题的解决方案。它的存在仅仅是因为它的作者无法在Makefiles中记录它们所属的位置和允许它们的空间。并不是使用XML让ant比Make好。(我认为这只是一个微不足道的语法差异。)相反,是Ant的执行模型造成了所有的不同。Make的问题是它生成要按特定顺序执行的shell命令,这些命令通常是不可移植的。相比之下,Ant声明要执行的任务,并让Ant应用程序(和插件类)执行找出如何执行任务。-1 XML在某种程度上优于Makefile?ant是一种解决问题的方法。它的存在仅仅是因为它的作者无法在Makefiles中记录它们所属的位置和允许它们的空间。并不是使用XML使ant优于Make。(我认为这只是一个微不足道的语法差异。)相反,是Ant的执行模型造成了所有的不同。Make的问题是它生成要按特定顺序执行的shell命令,这些命令通常是不可移植的。相比之下,Ant声明要执行的任务,并让Ant应用程序(和插件类)执行找出如何执行任务。