微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我可以执行新创build的不可执行的文件?

在Ubuntu中,Ubuntu上认的umask是022 ,这意味着新创build的文件可以被所有人读取,但是只能被所有者读取,没有人可以执行它。 在这种情况下,我创build一个新的文件

touch test.rb # Its content is: puts "hello world" ls -l demo.rb # -rw-r--r--

然后我执行test.rb :

ruby test.rb # output: "hello world"

由于该文件的所有者没有“x”权限,那么为什么我可以成功运行该文件? 或者我错过了一些关于它的知识?

如何按date批量重命名文件

防止gtk FileChooserDialog调用目录中的所有文件统计信息?

debuggingfutex锁

我应该开始将我的系统作为Wine准备好吗?

在debian服务器上closures监视器

Python – 如何在GNU / Linux中获取Firefox的URL栏内容

硬件事件和硬件caching事件在perf中有什么区别?

如何实现readlink来查找path

从vim发送代码到stata

IPv4头校验和计算,我错过了什么

您不是以二进制形式执行文件。 你用参数test.rb执行ruby二进制文件,它解释Ruby脚本。 因此,只有ruby二进制需要执行权限而不是脚本本身。

你可以通过运行stat (which ruby)来检查二进制文件的权限。

另一方面,如果你放置

#!/usr/bin/ruby

在脚本的顶部,使用chmod a+x test.rb使其可执行,然后您可以让Linux运行它。 内核的binfmt模块将检查#! (称为shebang),并为您运行解释器。

你可以在许多shell脚本中找到这个shebang。 现在,为了在PATH变量(如/usr/local/bin/ruby上可用的其他位置使用解释器二进制文件,通常会放置#!/usr/bin/env ruby或#!/usr/bin/env python 。 env是一个二进制程序。 它将作为一个程序来运行它的论点。 内核将传递脚本作为参数,这将导致命令/usr/bin/env ruby test.rb

GrzegorzŻur是正确的。

你可以像这样修改你的test.rb:

#!/usr/bin/env ruby puts 'hello world'

然后你执行它. :

$ ./test.rb

你会看到Permission denied 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐