5

目的:

  • 保存一个将数据写入磁盘的程序,以免徒劳地尝试写入完整的文件系统;
  • 节省带宽(如果无处存储,请不要下载);
  • 节省用户和程序员的时间和精力(通知他们问题,而不是让他们通过阅读误导性错误消息和“为什么这个软件不工作!”而撕毁他们的头发)。

问题分为两部分:

  1. 报告所有文件系统或相关路径所属文件系统的存储空间统计信息(可用、已用、总计等)。
  2. 在空间不足时报告文件系统错误。

第1部分

请分享NATIVE Raku 替代品(TIMTOWTDIBSCINABTE “Tim Toady Bicarbonate”)到:

raku -e 'qqx{ df -P $*CWD }.print'

在这里,通过带有插值的 shell 引用执行(无磁盘)外部程序,提供raku -eortable -format 参数和当前工作目录,然后是 s的输出。dfqqx{}-P$*CWD.printdf


该片段最初被编写为raku -e 'qqx{ df -hP $*CWD }.print'- 具有uman -h-readable 和-Portable - 但事实证明它不是一个普遍有效的命令。在 OpenBSD 7.0中,它以错误退出:df: -h and -i are incompatible with -P.
为了增加人类可读性,您可以考虑Number::Bytes::Human 模块

4

2 回答 2

7
raku -e 'run <<df -hP $*CWD>>'

如果你只是df在 STDOUT 上输出给你的东西,你不需要做任何事情。

<< >>双引号单词,因此$*CWD将被插值。

于 2021-08-02T11:01:50.420 回答
3

第 1 部分 — 报告存储空间统计信息

没有用于报告存储空间统计信息的内置功能。选项包括:

  • NativeCall编写用于调用平台/文件系统特定系统调用(例如statvfs())并使用该调用返回的信息的Raku 代码(几行) 。

  • 使用合适的 Raku 库。FileSystem::Capacity为您挑选并运行一个外部程序,然后以可移植的形式提供其结果数据。

  • 使用run(或类似的1)调用特定的外部程序,例如df.

  • 使用Inline::*外语适配器启用外语 PL 的解决方案以报告存储空间统计信息,并使用它提供的信息。2

第 2 部分 — 报告空间不足

Raku 似乎巧妙地报告No space left on device

> spurt '/tmp/failwrite', 'filesystem is full!'
Failed to write bytes to filehandle: No space left on device
  in block <unit> at <unknown file> line 1

> mkdir '/tmp/failmkdir'
Failed to create directory '/tmp/failmkdir' with mode '0o777': Failed to mkdir: No space left on device
  in block <unit> at <unknown file> line 1

(程序员需要避免丢弃这些异常。)

脚注

1 在不涉及 shellrun的情况下运行外部命令。这保证了与壳相关的风险被消除。也就是说,Raku 还支持使用 shell(因为在某些情况下这很方便且合适)。有关此问题的一些简短讨论,请参阅问题下的评论交流(例如this one ),以及有关风险摘要的文档:shell

所有 shell 元字符都由 shell 解释,包括管道、重定向、环境变量替换等。Shell 转义是一个严重的安全问题,可能会导致与异常文件名混淆。run如果您想安全,请使用。

2 Raku 的外语适配器(Inline::命名空间中的 Raku 模块)允许 Raku 代码使用以其他语言编写的代码。这些适配器不是 Raku 语言标准的一部分,如果是这样的话,大多数还只是处于实验状态,但相反,最好的适配器状态良好,允许 Raku 代码使用外国库,就好像它们是为 Raku 编写的一样。(截至 2021 年Inline::Perl5是最完善的。)

于 2021-08-21T12:03:04.403 回答