我一直在使用MATLAB的system
命令获取一些Linux命令的结果,就像下面这个简单的例子:
[junk, result] = system('find ~/ -type f')
这个代码在正常情况下能够按照预期工作,但是如果用户同时在MATLAB的命令窗口输入内容,则可能会出现意外情况。特别是当执行长时间的find
指令时,这种情况较为普遍。如果出现这种情况,用户的输入似乎会与find
指令的结果混合在一起(然后程序就崩溃了)。
例如,下面的输出:
/path/to/file/one
/path/to/file/two
/path/to/file/three
/path/to/file/four
我可能会得到:
J/path/to/file/one
u/path/to/file/two
n/path/to/file/three
k/path/to/file/four
为了更容易地演示,我们可以运行如下内容:
[junk, result] = system('cat')
在命令窗口中输入内容,然后按下CTRL+D关闭流。变量result
将是您在命令窗口中输入的任何内容。
有没有更安全的方法可以在MATLAB中调用系统命令而不会冒着输入被破坏的风险?
unix
而不是system
时,是否观察到相同的行为? - Robert Seifertsystem('cat')
的例子可能是一个糟糕的复制案例:cat
应该将其 stdin 回显到 stdout,而 Matlab 似乎将其命令窗口或控制台键盘输入钩子化为 system() 调用的 stdin。(就像 shell 做的那样。)让您与需要用户输入的程序进行交互。find
的例子更奇怪;它不应该随机混合它在 stdin 中得到的内容到其输出中,这看起来像是真正的交叉连线。FWIW,我可以在 OS X 上使用 R2014a 复制这两个例子。 - Andrew Janke