使用System.cmd时,带有通配符的Elixir shell命令失败
发布时间:2020-12-16 01:44:34 所属栏目:安全 来源:网络整理
导读:我有一个elixir程序,需要以编程方式删除名为这样的可变数量的PNG文件. /path/to/dir/uuid-frames-001.png/path/to/dir/uuid-frames-002.png/path/to/dir/uuid-frames-003.png 等等 当然,我已经提出了以下elixir代码来删除这些文件. System.cmd("rm",["/path/
我有一个elixir程序,需要以编程方式删除名为这样的可变数量的PNG文件.
/path/to/dir/<uuid>-frames-001.png /path/to/dir/<uuid>-frames-002.png /path/to/dir/<uuid>-frames-003.png 等等 当然,我已经提出了以下elixir代码来删除这些文件. System.cmd("rm",["/path/to/dir/" <> uuid <> "-frames-*.png"]) 我已经看到上面的代码以多种方式失败了.首先,我在服务器上运行它并看到以下stacktrace: /bin/rm: cannot remove '/path/to/dir/<uuid>-frames-*.png': No such file or directory 我还在控制台会话上运行此代码并看到完全相同的输出. 如果我在bash会话中运行以下命令,它工作正常! rm /path/to/dir/u0026lt;uuidu0026gt;-frames-*.png 它返回0错误代码并删除预期的文件.似乎elixir将*解释为文字字符,而不是执行预期的通配符删除.知道怎么做到这一点?谢谢! 附: 显然,< uuid>是一个实际的uuid,因此不应该从字面上解释这个问题的范围. 解决方法
像*这样的通配符由shell扩展,而不是由rm扩展.您的命令只会删除名为/path/to/dir/u0026lt;uuidu0026gt;-frames-*.png的文件.
您可以通过将命令传递给像sh这样的shell来扩展通配符: System.cmd("/bin/sh",["-c","rm /path/to/dir/#{uuid}-frames-*.png"]) 或者使用os:cmd / 1,默认情况下调用sh(注意单引号而不是double): :os.cmd('rm /path/to/dir/#{uuid}-frames-*.png') (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |