Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从Bash调用Java时无法执行二进制文件_C_Linux_Bash_Shell - Fatal编程技术网

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

C 从Bash调用Java时无法执行二进制文件,c,linux,bash,shell,C,Linux,Bash,Shell,我使用的是Ubuntu 14.04 涉及4个文件:“compile.sh”、“execute.sh”、“work.c”、“tester.sh” 在“compile.sh”中,它编译“work.c”文件并输出一个名为“execute.sh”的可执行文件。在我自己的测试过程中,我执行/compile.sh,然后执行/execute.sh来运行我的C程序。这很有效 现在,“tester.sh”是一个调用Java程序的脚本,这个Java程序也做同样的事情。它将首先运行我的“compile.sh”,然后执

我使用的是Ubuntu 14.04

涉及4个文件:“compile.sh”、“execute.sh”、“work.c”、“tester.sh”

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

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

正在读取程序的第一行

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

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

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

您可以忽略第三行“第一行执行…”;它试图检查我的输出是否与测试仪完全匹配。由于无法执行二进制文件,因此第一行肯定不匹配。 那么为什么它会说“不能执行二进制文件”

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在我的本地机器中;我们可以假设测试脚本没有问题。)

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

文件
execute.sh
只是编译
work.c
文件的输出文件。默认情况下,它类似于
gcc
中的
a.out
。我可以从终端运行
/execute.sh
,查看所有正确的输出

问题是,当您运行它时,您执行了
/execute.sh
,shell直接执行。Java以
bash./execute.sh
的形式运行它,这将生成错误。在命令行中尝试一下

处方 表面上看,您需要更改
compile.sh
,可能是这样(从
work.c
生成程序
work
):

然后编写一个名为
executable.sh
的shell脚本,其内容如下:

#!/bin/bash
exec ./work "$@"

此脚本使用给定的任何命令行参数运行程序。
exec
表示shell用您的程序替换自身;这样做有一些小的好处,不过如果您从脚本中省略
exec
,也可以。

使用
.sh
作为二进制文件的扩展名。。。至少可以说很奇怪。
file execute.sh
说什么?您能手动运行
execute.sh
吗?你确定那应该是一个二进制文件而不是运行二进制文件的脚本吗?很难说。向我们展示尝试执行
/execute.sh
(可能是Java)的代码—可能有代码假定这是基于.sh扩展名的shell脚本。并确保它尝试运行您认为可以运行的execute.sh文件,而不是位于文件系统其他位置的其他文件。file execute.sh只是编译work.c文件的输出文件。它就像默认情况下gcc中的.out一样。我可以从终端运行./execute.sh并查看所有正确的输出。它现在可以工作了。你说到点子上了。execute.sh应该包含脚本。谢谢
#!/bin/bash
exec ./work "$@"