gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:12 25 4
gpt4 key购买 nike

我有两个 (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

缺少什么?

最佳答案

您的脚本是否以 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 类型的编辑器创建的,它可能具有 carriage-return/line-feed 的“DOS”行结尾 - 这很可能会导致脚本执行出现问题。

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

od -xcb /mnt/hgfs/F/working/script.sh

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

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


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

gcc -c ./main.c -o ./main.o

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

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

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

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

关于在 bash 脚本上调用 execve bash 找不到参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com