微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当文件路径中有空格时,如何使用“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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐