我创建了一个名为" myscript.h"的简单bash脚本。我给了它一个.h扩展名,原因我在这里没有透露。这个bash脚本位于" / var / ftp / something中,带有空格"。
从终端,我可以输入" / var / ftp / something with spaces / myscript.h"并且脚本完美无缺。
但是,从我的C程序中,我输入
system("/var/ftp/something with spaces/myscript.h")
它抱怨" / var / ftp / something"找不到。我已使用正斜杠将系统调用更改为以下内容:
system("/var/ftp/something\ with\ spaces/myscript.h")
然而,它仍然抱怨" / var / ftp / something"找不到。假设我无法更改目录名称,我该如何解决这个问题呢?
谢谢!
答案 0 :(得分:7)
要运行单个脚本,您可以避免使用system(3)库函数(并使用较低级别的系统调用,例如fork(2),execve(2),waitpid(2) ...用于system(3))的实现,或者您可以在将脚本名称传递给system(3)时引用。
有关详细信息,请阅读Advanced Linux Programming。
在Linux上,system(3)被记录为分叉/bin/sh -c
进程。见sh(1p)。而POSIX shell有一些quoting rules。您可以适当地使用双引号和反斜杠。因此,您将构建(并且可能检查)传递给system(3)的字符串(可能使用asprintf(3)或snprintf(3) care )。请注意,C编译器还具有string literals的(不同)引用约定。
一般来说,你应该避免code injection (想象一个顽皮的用户提供一些a; rm -rf $HOME &;
输入作为"目录"名称;你不要&#39 ; t想要在奇怪的"/var/ftp/a; rm -rf $HOME &;/myscript.h"
字符串
在您的特定情况下,我建议您使用fork(2),execve(2)(可能通过一些精心选择的exec(3)功能),waitpid(2) ...。这有一点点优点,可以避免依赖并运行/bin/sh
,因此可能稍微快一点(毫秒)。
更多地了解Unix shell的作用;例如,阅读bash
中的各种shell expansions(它们类似于POSIX sh
规定的那些),并了解globbing。见glob(7)
答案 1 :(得分:0)
请注意,从shell运行时,您需要添加引号。你需要在这里做同样的事情。在您发送给system
的路径名称中添加引号:
system("\"/var/ftp/something with spaces/myscript.h\"")
答案 2 :(得分:0)
这适用于gcc版本5.4.0
system("\'\'/var/ftp/something\\ with\\ spaces/myscript.h\'\'");
答案 3 :(得分:-1)
只需将文件名放在单引号
中system("rm '/var/ftp/something with spaces/myscript.h'")