我有两个(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
少了什么东西?
您的脚本是否以 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调用中环境变量被破坏了。
| 归档时间: |
|
| 查看次数: |
7300 次 |
| 最近记录: |