比MATLAB的`system`命令更安全的替代方案

Sam*_*ley 7 linux matlab

我一直在使用MATLAB的system命令来获取一些linux命令的结果,如下面的简单示例所示:

[junk, result] = system('find ~/ -type f')
Run Code Online (Sandbox Code Playgroud)

除非用户同时键入MATLAB的命令窗口,否则这将按预期工作.在长期find指挥期间这并不罕见.如果发生这种情况,那么用户的输入似乎与find命令的结果混淆(然后事情就会中断).

作为一个例子,而不是:

/path/to/file/one
/path/to/file/two
/path/to/file/three
/path/to/file/four
Run Code Online (Sandbox Code Playgroud)

我可能会得到:

J/path/to/file/one
u/path/to/file/two
n/path/to/file/three
k/path/to/file/four
Run Code Online (Sandbox Code Playgroud)

为了便于演示,我们可以运行如下:

[junk, result] = system('cat')
Run Code Online (Sandbox Code Playgroud)

在命令窗口中键入内容,然后按CTRL + D关闭流.该result变量将是你输入任何在命令窗口.

有没有更安全的方法让我从MATLAB调用系统命令而不会有输入损坏的风险?

Sam*_*ley 3

感谢 Andrew Janke 帮助我找到了这个解决方案。

为了轻松重现错误,我们可以运行以下命令:

[ret, out] = system('sleep 2');
Run Code Online (Sandbox Code Playgroud)

如果我们在运行时输入一些字符,out变量将被我们输入的内容污染。

此问题的解决方案是将 stdin 从 /dev/null 重定向,如下所示:

[ret, out] = system('sleep 2 < /dev/null');
Run Code Online (Sandbox Code Playgroud)

这可以防止out变量被用户输入污染。

有趣的是,这似乎修复了当前 MATLAB 会话的原始测试用例(在 R2014a OSX 和 R2013b Linux 上测试),因此如果我们执行另一个[ret, out] = system('sleep 2');操作,输出将不再受到用户输入的污染。