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

我创建了一个名为“myscript.h”的简单bash脚本.我给它一个.h扩展名,原因我不会在这里透露.这个bash脚本位于“/ var / ftp / something with spaces”中.

从终端,我可以输入“/ var / ftp / something with space / 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”.假设我无法更改目录名称,我该如何解决这个问题呢?

谢谢!

解决方法:

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

有关详细信息,请参阅Advanced Linux Programming.

在Linux上,记录了system(3)来分叉a / bin / sh -c进程.请参阅sh(1p).并且POSIX shell有一些quoting rules.您可以适当地使用双引号和反斜杠.因此,您将构建(并且可能检查)传递给system(3)的字符串(可能需要谨慎使用asprintf(3)snprintf(3)).请注意,C编译器还具有(不同的)string literals的引用约定.

一般来说,你应该避免使用code injection(想象一个顽皮的用户给出一些; rm -rf $HOME&amp ;;输入作为“目录”名称;你不想在奇怪的“/ var / ftp / a上运行system(3) ; rm -rf $HOME&amp ;; / myscript.h“string”

在您的特定情况下,我建议使用fork(2),execve(2)(可能通过一些仔细选择exec(3)功能),waitpid(2) …适当.这有一点点优点,可以避免依赖和运行/ bin / sh,因此可能稍微快一点(毫秒).

更多地了解Unix shell的作用;例如,阅读bash中的各种shell expansions(它们类似于POSIX sh规定的那些)并注意globbing.参见glob(7)

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...