0

我有两个(Ubuntu Linux)bash 脚本,它们接受输入参数。它们需要同时运行。我尝试execve了论据,例如

char *argv[10] = { "/mnt/hgfs/F/working/script.sh", "file1", "file2", NULL };

execve(argv[0], argv, NULL)

但 bash 脚本似乎无法在例如$0, $1,找到任何参数$2

printf "gcc -c ./%s.c -o ./%s.o\n" $1 $1;
gcc -c ./$1.c -o ./$1.o -g
exit 0;

输出是gcc -c ./main.c -o ./main.o ,然后是很多错误,比如/usr/include/libio.h:53:21: error: stdarg.h: No such file or directory

少了什么东西?

4

1 回答 1

5

您的脚本是否以 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

证明这一点是肯定的,因为它看起来$1main.

您实际遇到的问题是编译器正在工作,但它无法strdarg.h从您的文件中找到包含- 这与是否可以看到这些参数libio.h无关。bash

我的建议是尝试使用该命令手动编译它,看看是否遇到相同的错误。如果是这样,那是您尝试编译的问题,而不是bashorexec问题。

如果编译没问题,可能是因为你execve调用的环境变量被破坏了。

于 2013-02-10T04:53:19.737 回答