我正在尝试创建一个linux shell脚本,它在java中编译程序并仅在编译器没有错误时运行它。这是我的尝试,它不起作用,并且每次都运行程序,即使有错误:
#!/bin/bash
cd ~/Desktop/Foo/src
compilerOutput=$(javac Foo.java)
if ["$compilerOutput" = ""]; then
java Foo
fi
答案 0 :(得分:1)
与任何体面的Unix工具一样,如果出现错误,javac
应将其退出代码设置为非零。
javac Foo.java && java Foo
在幕后,shell会检查退出代码(如果要显式检查它,则可以$?
使用),并且仅当它为零时才执行下一个操作。
如果你想要更复杂的逻辑,你可以说
if javac Foo.java; then
date +"%c success" >>logfile.log
java Foo
else
date +"%c fail (exit code $?)" >>logfile.log
echo "Oh dear" | wall
fi
答案 1 :(得分:0)
问题的根本原因是
compilerOutput=$(javac Foo.java)
当您使用command substitution时,仅将标准输出分配给compilerOutput
对于javac
,没有标准输出,即标准输出始终为空,您在屏幕上看到的标准错误
即使程序中没有错误也是如此
if ["$compilerOutput" = ""]; then
将始终为true,因为标准输出始终为空
<强>解决方案强>
执行此操作的正确方法是通过shell变量$?
<强>代码强>
#!/bin/bash
cd ~/Desktop/Foo/src
javac Foo.java 2> errors
if [ $? = "0" ]; then
java Foo
fi
所做的更改
javac Foo.java 2> errors
此语句将b标准错误重定向到errors
文件
if [ $? = "0" ]; then
检查上一个命令javac Foo.java
的退出状态是否为0
(成功编译)