Raku-native disk space 用法

Raku-native disk space usage

目的:

问题分为两部分:

  1. 报告存储space统计信息(可用、已用、总计等),所有文件系统或相关路径所属文件系统的统计信息。
  2. 报告 运行 上的文件系统错误,共 space。

第 1 部分

请分享 NATIVE Raku 替代品 (TIMTOWTDIBSCINABTE "Tim Toady Bicarbonate") 至:

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

这里,raku -executes df (disk free) excutes df (disk free) external program via shell quoting with interpolation qqx{}, feeding -P ortable-format 参数和 $*CWD 当前工作目录,然后 .printdf 的输出。


代码段最初被写成 raku -e 'qqx{ df -hP $*CWD }.print'-human-readable 和 -Portable — 但事实证明它不是无处不在的有效命令。 In OpenBSD 7.0,它退出并出现错误:df: -h and -i are incompatible with -P
为了增加人类可读性,您可以考虑 Number::Bytes::Human module

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

如果您只是在 STDOUT 上输出 df 给您的内容,则无需执行任何操作。

<< >>是双引号,所以$*CWD会被插值

第 1 部分 - 报告存储 space 统计数据

没有用于报告存储 space 统计信息的内置函数。选项包括:

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

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

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

  • 使用Inline::* foreign language adaptor启用调用外国PL的解决方案来报告存储space统计信息,并使用它提供的信息。2

第 2 部分 - 报告 运行 共 space

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 run 运行外部命令 不涉及 shell。这保证消除了涉及 shell 的风险。也就是说,Raku 还支持使用 shell(因为在某些情况下这会很方便和合适)。请参阅问题下的评论交流(例如 ) for some brief discussion of this, and the shell doc 风险摘要:

All shell metacharacters are interpreted by the shell, including pipes, redirects, environment variable substitutions and so on. Shell escapes are a severe security concern and can cause confusion with unusual file names. Use run if you want to be safe.

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