我使用的是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在我的本地机器上;我们可以假设测试器脚本没有任何问题。)
答案 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
就可以了。