如何在 Windows 上通过管道传输 Scilab

How to pipe Scilab on Windows

我正在尝试在 Windows 上使用 Scilab 进行简单的管道传输,但它在 cmd.exe 和 PowerShell 中都不起作用。 我知道我可以像echo %pi | scilex -nb -quit一样简单地将命令传递给解释器,但我想传递和读取数据而不是直接发送命令。

我正在使用 mgetl 和文件描述符 %io(1) 来访问标准输入,但是 returned 值是一个空矩阵:

>echo Hello, World! | scilex -nb -quit -e "mgetl(%io(1))"
 ans  =

    []

如果我使用 type 和一个文件,同样的行为也会发生。这里 tmp 有一个换行符,但这无关紧要,因为无论有没有它,行为都是一样的:

>type tmp
Hello, 
World!

>type tmp | scilex -nb -quit -e "mgetl(%io(1))"
 ans  =

    []

然而,通过移除管道的左侧并保持 %io(1) 使 Scilab 等待用户输入直到 return 然后 Ctrl+C被按下:

>scilex -nb -quit -e "mgetl(%io(1))"
Hello, World!
 ans  =

  "Hello, World!"

使用 fd=mopen('tmp'); mgetl(fd), mclose(fd); 作为表达式参数,正如预期的那样有效,但这不是我想要的,因为它取决于保存的文件。 我想通过在 cmd.exe 或 PowerShell 中使用 | 直接从另一个进程的输出中读取数据。 这种方法有什么问题?这是意外行为吗?

您似乎无法使用 mgetl 读取 stdin,但使用使用 Fortran 格式的 read 可以正常工作

C:\>echo Hello, World! | scilex -nb -e "read(%io(1),1,1,'(a)')"
 ans  =

  "Hello, World! "


C:\> 

mgetl 无法从 stdin 读取的事实是一个错误,将在即将发布的 Scilab (6.1.1) 版本中修复:http://codereview.scilab.org/#/c/21778,感谢报告。