Raku-native 磁盘空间使用情况

uxe*_*xer 5 diskspace raku

目的:

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

问题分为两部分:

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

第1部分

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

raku -e 'qqx{ df -hP $*CWD }.print'
Run Code Online (Sandbox Code Playgroud)

这里,raku -executesdf经由壳(磁盘免费)的外部程序与插值引用qqx{},喂养-hUMAN可读参数,-Portable格式参数和$*CWD当前工作目录,则.printS中df的输出。

Eli*_*sen 7

raku -e 'run <<df -hP $*CWD>>'
Run Code Online (Sandbox Code Playgroud)

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

<< >>是双引号的话,这样$*CWD会被插入。

  • 如果您指的是 Raku 本身可以使用 `df` 的信息 *而无需*调用 `df` 外部程序,那么答案是:“不,Raku 不会这样做”。 (3认同)

uxe*_*xer 3

第 1 部分 \xe2\x80\x94 报告存储空间统计信息

\n

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

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

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

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

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

    \n
  • \n
\n

第 2 部分 \xe2\x80\x94 报告空间不足

\n

Raku 似乎简洁地报告道No space left on device

\n
> spurt \'/tmp/failwrite\', \'filesystem is full!\'\nFailed to write bytes to filehandle: No space left on device\n  in block <unit> at <unknown file> line 1\n\n> mkdir \'/tmp/failmkdir\'\nFailed to create directory \'/tmp/failmkdir\' with mode \'0o777\': Failed to mkdir: No space left on device\n  in block <unit> at <unknown file> line 1\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

脚注

\n

1 run运行外部命令而不涉及 shell。这保证了消除涉及外壳的风险。也就是说,Raku 还支持使用 shell(因为这在某些情况下可能很方便且合适)。请参阅问题下的意见交换(例如,此一个)以获取对此的一些简短讨论,并参阅shell文档以获取风险摘要:

\n
\n

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

\n
\n

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

\n