C 如何使用“执行bash脚本”;系统();当文件路径中有空格时?

C 如何使用“执行bash脚本”;系统();当文件路径中有空格时?,c,linux,bash,C,Linux,Bash,我创建了一个名为“myscript.h”的简单bash脚本,我为它提供了一个.h扩展名,其原因我将在这里不公开。这个bash脚本位于“/var/ftp/something with spaces”中 在终端上,我可以输入“/var/ftp/something with spaces/myscript.h”,脚本工作得非常好 然而,在我的C程序中,我输入 system("/var/ftp/something with spaces/myscript.h") 它抱怨没有找到“/var/ftp/so

我创建了一个名为“myscript.h”的简单bash脚本,我为它提供了一个.h扩展名,其原因我将在这里不公开。这个bash脚本位于“/var/ftp/something with spaces”中

在终端上,我可以输入“/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”。假设我不能更改目录名,我该如何解决这个问题


谢谢

请注意,从shell运行时添加了引号。在这里你也需要这样做。在要发送到
系统的路径名中添加引号:

system("\"/var/ftp/something with spaces/myscript.h\"")

要运行单个脚本,可以避免使用库函数(并使用的实现使用的较低级别的系统调用,如,…),或者在将脚本传递给时可以引用脚本名称

有关更多详细信息,请阅读

在Linux上,被记录为fork一个
/bin/sh-c
进程。看见POSIX外壳也有一些。您可以适当地使用双引号和反斜杠。因此,您将构造(并可能检查)传递给的字符串(可能使用或小心)。请注意,C编译器也有(不同的)引用约定

一般来说,您应该避免(想象一个淘气的用户将一些
a;rm-rf$HOME&;
输入作为“目录”名称;您不想在奇怪的
“/var/ftp/a;rm-rf$HOME&;/myscript.h”
字符串上运行)

在您的特殊情况下,我建议使用(可能通过一些仔细选择的函数)。。。适当地。这有一点好处,可以避免依赖和运行
/bin/sh
,因此速度可能会稍微快一点(一毫秒)


更多地了解企业的角色;例如,阅读
bash
(它们与POSIX
sh
)中的各种命令类似)并了解。请参见

将文件名放在单引号内即可

system("rm '/var/ftp/something with spaces/myscript.h'")

这应该适用于gcc版本5.4.0

system("\'\'/var/ftp/something\\ with\\ spaces/myscript.h\'\'");

尝试使用转义序列\“:system(“\”/var/ftp/something with spaces/myscript.h\”)在字符串中添加引号;使用
.h
扩展名调用bash脚本很有趣……您可以使用
execl(“/var/ftp/something with spaces/myscript.h”,NULL)
(首先使用fork)高效、稳健地运行程序.
system()
是为了“方便”,速度较慢,更脆弱,可能有安全隐患。简短回答:反斜杠由c-lexer解释:
'\'
等于一个空格。因此,您应该将它们加倍,shell将看到一个反斜杠加一个空格。(或者:使用
'\'将整个内容放在转义引号中)
'\''
,就像在一个答案中一样)@Izzo:因为C解析双引号字符串中的反斜杠,所以实际上需要将每个反斜杠都写为\\。因此,反斜杠转义命令是
system(“/var/ftp/something\\with\\spaces/myscript.h”)
。在POSIXy系统中,您可以使用单引号,即。
system(“'/var/ftp/something with spaces/myscript.h')
。我不知道Linux,但这种技巧在windows上不起作用。它在Linux上起作用,但可能需要转义某些字符(反斜杠、换行符、双引号等),如果文件路径包含引号,就不那么简单了。而且
rm
系统中是无用的
,请使用@thatotherguy:No,
unlink
/bin/rm
使用的系统调用(用于文件)哦,我现在明白你的意思了。是的,
system(“rm foo”)
是个坏主意,应该用
unlink(“foo”)