【问题标题】:Raku-native disk space usageRaku-native 磁盘空间使用情况
【发布时间】:2021-10-07 17:07:03
【问题描述】:

目的:

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

问题分为两部分:

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

第 1 部分

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

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

在这里,raku-executes df(无磁盘)外部程序通过 shell 引用插入 qqx{},输入 -Portable-format 参数和 $*CWD 当前工作目录,然后是 .print s df 的输出。


sn-p 最初被写为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

【问题讨论】:

  • 嗨。欢迎使用 SO 和 [raku] 标签。 :) 这对我来说就像XY question。例如,在已经有类似df 的程序的操作系统上,明智的做法是使用它(但出于安全考虑,使用run 而不是qx)。在一个out类似df 程序的操作系统上——也就是说,一个非常不成熟的操作系统——Raku 可能没有机会进行补偿。但是你还没有谈到这些方面。那么也许您的真正目的是了解 Raku?不管是什么,我认为如果您编辑您的问题以添加您的问题背后的真正内容,将会有很大帮助。
  • @raiph 嗨,raiph。感谢您的关注。确实存在沟通问题,在这种情况下,坦率地说,我在我的问题中没有看到任何错误陈述。底线“目的”可能有些措辞沉重,但它准确地描述了我想要的。 sn-p 正是我想要的,除了不是本地的。好的,1。我手头的任务是:我需要下载并保存一些东西,然后对其进行整形以保存中间缓存,最后保存结果。这会消耗存储空间,因此我发现事先检查可用空间并在课程期间进行检查是一个不错的主意。 [继续下一条评论]
  • @raiph 2. 我知道run 'df', '-hP', $*CWD 可能更安全,因为这种形式便于仔细提供零件,但run «df -hP $*CWD» 是否比qqx{} 更安全?你也可以随意扔一些垃圾! 3. 我选择qqx{} 而不是run,因为前者使输出完全可用。我会split 它然后以编程方式检查可用空间。 [继续下一条评论]
  • @raiph 4. 是的,我学习 Raku,犯了明显的错误。 5. 如果主题超出 Raku,是不是关于操作系统和文件系统架构而不是关于 Raku? 6. 尽管如此,凭借 Raku 的力量,我对“非本地人”的答案耸了耸肩。至少我希望docs.raku.org/language/nativecall 方法类似于docs.raku.org/language/…modules.raku.org/search/?q=inline
  • 你好@uxer。我同意你的观点,没有任何错误陈述。更一般地说,您所写的内容没有任何错误。但是您添加的信息极大地改善了您的问题。从那以后,我遇到了a GH issue(很可能被您打开/关闭,但无论哪种方式都无关紧要),这是一个很好的激励示例。这是可以避免的痛苦和烦恼;我们肯定可以(而且必须)做得更好吗?

标签: raku diskspace linux-disk-free


【解决方案1】:
raku -e 'run <<df -hP $*CWD>>'

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

&lt;&lt; &gt;&gt; 是双引号,因此 $*CWD 将被插值。

【讨论】:

  • 我的问题是如何把raku -e 'qx{ echo "from external program" }.print'变成raku -e 'put "from Raku"',但是有存储空间
  • 抱歉,已将raku -e 添加到答案中。
  • 如果您指的是df 的信息在Raku 本地没有 调用df 外部程序,答案是:“不,Raku 不不要那样做”。
  • 你的 sn-p 想要一个 ">"
  • 糟糕,已修复 :-) 谢谢!
【解决方案2】:

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

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

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

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

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

  • 使用Inline::* foreign language adaptor 启用外部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

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

脚注

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

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

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

【讨论】:

  • df 的建议非本地替代方法:使用 NativeCall 调用,例如,statvfs()”。 NativeCall 和statvfs() 是一种native 方法。 NativeCall 是内置的。有了它,人们可以编写 Raku 代码,该代码“神奇地”与程序运行平台上可用的本机功能接口。 (您不会编写 C,但需要知道足够多的 C 才能过关。)statvfs 是 *nix 操作系统上可用的本机功能(系统调用)。如果你自己不能让它工作,你可以问另一个 SO 问题,询问如何打电话给statvfs() 并使用它的数据。
  • @raiph 在 Raku 的 NativeCall 案例中,native 的定义是不是有些模糊?不是Raku,是C,所以不是native,而是内置魔法,所以是native?那么 NativeCall 到底有多原生呢?这不是一种特殊的本土化吗?答案已作为社区 wiki 发布,因此欢迎熟悉该主题的人自行修改文章。谢谢
  • 嗨@uxer。谢谢你的耐心。当我写“NativeCall is not”时,我的意思是 NativeCall 不是 ambiguous。不幸的是,英语是,而且我似乎不小心把你弄糊涂了,我怀疑 Liz 之前的困惑(英语不是她的母语)。
  • "NativeCall 到底有多原生?"如果“本机”意味着 C 代码或系统调用,那么非常!重点是允许使用 C 调用约定进行调用,然后在 Raku 中使用调用的结果。例如,如果你的系统支持statvfs() 或类似的,你可以调用它并使用它的信息。 (至少,afaik;我不是 C 黑客,你需要了解足够多的 C 才能理解 statvfs(),即使调用和使用它的代码是用 Raku 编写的。)“不是吗?一种特殊的本土性?”是的。它允许调用使用本机代码,而无需编写本机代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2018-07-24
  • 2018-06-30
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多