您的脚本是否以 hashbang 行开头?我认为这是必须的,例如:
#!/bin/bash
例如,请参见以下 C 程序:
#include <stdio.h>
#include <unistd.h>
char *argv[10] = { "./qq.sh", "file1", NULL };
int main (void) {
int rc = execve (argv[0], argv, NULL);
printf ("rc = %d\n", rc);
return 0;
}
当它使用以下qq.sh
文件编译并运行时,它输出rc = -1
:
echo $1
当您将文件更改为:
#!/bin/bash
echo $1
它输出:
file1
正如预期的那样。
您需要注意的另一件事是使用这些 VMWare 共享文件夹,由/mnt/hgfs
. 如果该文件是使用 Windows 类型的编辑器创建的,它的“DOS”行结尾可能是carriage-return/line-feed
- 这很可能会导致脚本执行出现问题。
您可以通过运行来检查这一点:
od -xcb /mnt/hgfs/F/working/script.sh
并查看是否\r
出现任何字符。
例如,如果我使用带有 hashbang 行的 shell 脚本(但在该行后面加上一个回车符),我也会得到rc = -1
输出,这意味着它找不到 shell。
而且,现在,根据您的编辑,您的脚本完全可以毫无问题地解释这些参数。它输出的事实:
gcc -c ./main.c -o ./main.o
证明这一点是肯定的,因为它看起来$1
像main
.
您实际遇到的问题是编译器正在工作,但它无法strdarg.h
从您的文件中找到包含- 这与是否可以看到这些参数libio.h
无关。bash
我的建议是尝试使用该命令手动编译它,看看是否遇到相同的错误。如果是这样,那是您尝试编译的问题,而不是bash
orexec
问题。
如果编译没问题,可能是因为你execve
调用的环境变量被破坏了。