我有两个(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
缺少什么?
答案 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}无关可以看到那些参数。
我的建议是尝试使用该命令手动编译它,看看你是否得到了相同的错误。如果是这样,那么您尝试编译的内容就会出现问题,而不是bash
或bash
问题。
如果编译好,可能是因为exec
电话中环境变量的破坏。