我一直在使用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调用系统命令而不会有输入损坏的风险?
感谢 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');操作,输出将不再受到用户输入的污染。