在 bash 脚本上调用 execve bash 找不到参数

T. *_*ter 0 c linux bash

我有两个(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;
Run Code Online (Sandbox Code Playgroud)

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

少了什么东西?

pax*_*blo 5

您的脚本是否以 hashbang 行开头?我认为这是必须的,比如:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

例如,请参阅以下 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;
}
Run Code Online (Sandbox Code Playgroud)

当使用以下qq.sh文件编译并运行它时,它输出rc = -1

echo $1
Run Code Online (Sandbox Code Playgroud)

当您将文件更改为:

#!/bin/bash
echo $1
Run Code Online (Sandbox Code Playgroud)

它输出:

file1
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。


您需要注意的另一件事是使用这些 VMWare 共享文件夹,以/mnt/hgfs. 如果该文件是使用 Windows 类型的编辑器创建的,则它可能具有“DOS”行结尾carriage-return/line-feed- 这很可能会导致脚本执行出现问题。

您可以通过运行以下命令来检查这一点:

od -xcb /mnt/hgfs/F/working/script.sh
Run Code Online (Sandbox Code Playgroud)

并查看是否\r出现任何字符。

例如,如果我使用带有 hashbang 行的 shell 脚本(但在该行中添加了回车符),我也会得到rc = -1输出,这意味着它找不到 shell。


现在,根据您的编辑,您的脚本在解释参数时完全没有问题。它输出的事实是:

gcc -c ./main.c -o ./main.o
Run Code Online (Sandbox Code Playgroud)

证明了这一点,因为它被$1视为main.

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

我的建议是尝试使用该命令手动编译它,看看是否出现相同的错误。如果是这样,则说明您尝试编译的内容有问题,而不是bashorexec问题。

如果编译正常,可能是因为您的execve调用中环境变量被破坏了。