从Bash调用Java时无法执行二进制文件

时间:2015-02-03 15:14:32

标签: c linux bash shell

我使用的是Ubuntu 14.04。

涉及4个文件:' compile.sh',' execute.sh',' work.c',' tester.sh&# 39;

在' compile.sh'中,它编译了' work.c'文件并输出一个名为' execute.sh'的可执行文件。在我自己的测试过程中,我执行./compile.sh,然后执行./execute.sh来运行我的C程序。这有效。

现在,' tester.sh'是一个调用Java程序的脚本,这个Java程序也做同样的事情。它将运行我的' compile.sh'首先然后执行' execute.sh'。它检查我的程序输出的正确性。 问题是当我./tester.sh时,我收到错误

  

从节目中读取第一行......

     

./exemand.sh:./execute.sh:无法执行二进制文件

     

第一行执行应该匹配:创建\ d大小的大小。+

     

执行失败(执行错误./execute.sh)

你可以忽略第三行"第一行执行....&#34 ;;它试图检查我的输出是否与测试仪完全匹配。由于无法执行二进制文件,因此第一行肯定不匹配。 那么为什么它说'#34;不能执行二进制文件"?

compile.sh中的内容

#!/bin/bash
gcc -Wall work.c -o execute.sh 

tester.sh中的内容

#!/bin/bash

java -cp bin/tester.jar edu.ssu.cs153.work1.Tester

(bin / tester.jar在我的本地机器上;我们可以假设测试器脚本没有任何问题。)

1 个答案:

答案 0 :(得分:0)

诊断

使用.sh扩展名命名可执行文件是很奇怪的,但不是不允许的。您的问题是Java代码试图将其作为shell脚本运行(例如bash ./execute.sh),并且它不是shell脚本,因此它失败了。您需要更改Java以将.sh文件作为可执行文件而不是shell脚本运行。或者,更好(因为您可能无法修复Java),修复编译以使其生成具有不同名称的可执行文件(例如work),并使execute.sh执行{{1 }}

  

文件./work只是编译execute.sh文件的输出文件。它与work.c默认为a.out。我可以从终端运行gcc并查看所有正确的输出。

麻烦的是,当你运行它时,你执行./execute.sh并直接执行shell。 Java将其作为./execute.sh运行,并生成错误。在命令行试试。

处方

从表面上看,您需要更改bash ./execute.sh,也许是这样(从compile.sh生成程序work):

work.c

您编写了一个名为#!/bin/bash gcc -o work -Wall work.c 的shell脚本,其内容为:

executable.sh

此脚本使用给定的任何命令行参数运行程序。 #!/bin/bash exec ./work "$@" 表示shell将替换为您的程序;这样做有一些小优点,但如果你从脚本中省略exec就可以了。