在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”权限,那么为什么我可以成功运行文件?还是我错过了一些知识?
解决方法:
您没有将文件作为二进制文件执行.您正在使用参数test.rb执行ruby二进制文件,它将解释Ruby脚本.因此,只有ruby二进制文件需要执行特权,而脚本本身则不需要.
您可以通过运行stat(哪个ruby)来检查二进制文件的特权.
另一方面,如果您放置
#!/usr/bin/ruby
在脚本的顶部,并使用chmod x x test.rb使它可执行,然后可以使Linux运行它.内核的binfmt模块将检查搜索是否为#! (称为shebang)中的文件,然后为您运行解释器.
您可以在许多Shell脚本中找到此shebang.如今,通常将#!/usr/bin/env ruby或#!/usr/bin/env python放进去,以便在/usr/local/bin / ruby等PATH变量上可用的其他位置使用解释器二进制文件.同样,env只是另一个二进制程序.它将作为程序运行其参数.内核将传递脚本作为参数,这将导致命令/usr/bin/env rubytest.rb.
标签:linux
来源: https://codeday.me/bug/20191026/1939650.html