加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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')

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读