在 Ruby 中复制 chmod 的符号模式,而无需显式调用系统命令

发布于 2024-12-19 19:08:40 字数 544 浏览 0 评论 0原文

在 Unix/Linux 系统上,chmod 函数支持“符号模式”,这意味着您可以使用权限执行本质上的位算术操作,例如 chmod u+x ...是为用户添加可执行权限的符号形式。 Ruby 的 FileUtils 中的 chmod 函数仅支持绝对位掩码作为权限,即您只能执行 FileUtils.chmod(0777, ...)FileUtils.chmod('u+x', ...) 将不起作用。

我知道一种方法是直接调用 system 命令:system("chmod u+x ..."),但我更愿意尽可能将代码保留在 Ruby 域中,而不是到处生成 shell。或者,我可以迭代 File 对象,File.stat 它们,获取它们现有的位掩码并单独修改它们,但符号模式将支持文件 glob,这要多得多简洁且不易出错。

有谁知道是否有一种方法可以以更优雅的方式做到这一点?

On Unix/Linux systems, the chmod function supports "symbolic modes", meaning you can do what is essentially bit-arithmetic with permissions, e.g. chmod u+x ... is a symbolic form for adding executable permissions for the user. The chmod function in Ruby's FileUtils only supports an absolute bitmask as a permission, i.e. you can only do FileUtils.chmod(0777, ...) but FileUtils.chmod('u+x', ...) will not work.

I get that one way to do this is to just call the system command directly: system("chmod u+x ..."), but I'd prefer to keep code in the Ruby domain as much as possible without spawning shells everywhere. Alternatively, I could iterate through File objects, File.stat them, get their existing bitmasks and modify them individually, but symbolic modes will support a file glob, which is much more succinct and less error prone.

Does anyone know whether there is a way to do this in a more elegant way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栖迟 2024-12-26 19:08:40

您使用什么版本的 Ruby?查看 1.9。 FileUtils.chmod 的 3 个文档

将指定文件(列表中)的权限位更改为位
模式表示的模式。 mode 是符号模式和绝对模式
可以使用。绝对模式是

FileUtils.chmod 0755,'某些命令'
FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod 0755, '/usr/bin/ruby', :verbose =>真的

符号模式为

FileUtils.chmod "u=wrx,go=rx", 'somecommand'
FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose =>真的

What version of Ruby are you using? Look at the 1.9.3 docs for FileUtils.chmod:

Changes permission bits on the named files (in list) to the bit
pattern represented by mode. mode is the symbolic and absolute mode
can be used. Absolute mode is

FileUtils.chmod 0755, 'somecommand'
FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true

Symbolic mode is

FileUtils.chmod "u=wrx,go=rx", 'somecommand'
FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文