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

时间:2013-02-10 04:46:23

标签: 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;

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

缺少什么?

1 个答案:

答案 0 :(得分:4)

你的脚本是否以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输出,这意味着它不能找不到壳。


而且,现在,根据您的编辑,您的脚本 no 无法解释参数。它输出的事实:

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

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

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

我的建议是尝试使用该命令手动编译它,看看你是否得到了相同的错误。如果是这样,那么您尝试编译的内容就会出现问题,而不是bashbash问题。

如果编译好,可能是因为exec电话中环境变量的破坏。