在Ubuntu中,Ubuntu上的默认umask是022
,这意味着新创建的文件可供所有人读取,但只有所有者可写,没有人可以执行它。
在这种情况下,我创建一个新文件:
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”权限,那么为什么我可以成功运行该文件?或者我错过了一些关于它的知识?
答案 0 :(得分:3)
您没有将文件作为二进制文件执行。您正在使用参数ruby
执行test.rb
二进制文件,并解释Ruby脚本。因此,只有ruby
二进制文件需要执行特权而不是脚本本身。
您可以通过运行stat (which ruby)
来检查二进制文件的权限。
另一方面,如果你放置
#!/usr/bin/ruby
在脚本顶部并使用chmod a+x test.rb
使其可执行,然后您可以让Linux运行它。内核的binfmt
模块将检查文件中的#!
(称为shebang),然后为您运行解释器。
你可以在很多shell脚本中找到这个shebang。现在通常会放置#!/usr/bin/env ruby
或#!/usr/bin/env python
,以便在PATH
变量/usr/local/bin/ruby
变量上的其他位置使用解释器二进制文件。再次env
只是另一个二进制程序。它将作为一个程序运行其参数。内核将脚本作为参数传递,这将导致命令/usr/bin/env ruby test.rb
。
答案 1 :(得分:1)
GrzegorzŻur是对的。
您可以像这样修改test.rb:
#!/usr/bin/env ruby
puts 'hello world'
然后您使用.
:
$ ./test.rb
您会看到Permission denied
。