为什么我可以运行与000权限的bash函数?
-
22-08-2019 - |
题
它是不完全分辩,我可以000的权限,但几乎运行bash函数。我的代码是:
#!/bin/bash
function hello {
echo Hello! }
下的hello-文件具有权限:
-r-------- 1 UnixBasics hello_file
Firtsly,I型与当前权限:
$ . ./hello_file;hello
在TWEAK是正确运行bash脚本脚本之前改变400组的权限000:
$ chmod 000 hello_file
$ . ./hello_file;hello [1]
-bash: ./hello_file: Permission denied
Hello!
它提供了一个错误,但它不停止运行的功能。我不明白。我现在取消设置的Hello功能:“非固定你好”。我收到错误:
-bash: ./hello_file: Permission denied
-bash: hello: command not found
为什么我没有在第一时间得到他们?有什么事情做缓存,缓存或类似的东西?为什么可以运行与000权限bash脚本[1]?
解决方案
您是不会运行脚本,你的采购(含)它。为了源脚本,你只需要读取权限。
顺便说一句,函数只是存在,他们没有权限。一旦文件来源和功能定义,你可以尽可能多的,只要你想运行它。
更新
为什么我没有在第一时间得到他们?有什么事情做缓存,缓存或类似的东西?
是,像大同回答,你好,可能是以前从文件的先前采购那里定义。 (“”内置命令)做你可能什么采购混淆。采购读取该文件,并运行在当前shell中的所有命令,然后返回到提示符。所以,如果你运行该文件一次,它的功能是在当前shell实例定义,他们呆在那里,直到你完成该shell会话(或取消或修改它们)。
为什么可以运行bash脚本与000的权限[1]?
您不能。请注意,它提出了一个错误。引用的输出:
$ . ./hello_file;hello [1]
-bash: ./hello_file: Permission denied
Hello!
您在单个命令行执行的两个命令。采购与“权限被拒绝”失败。在“你好!”输出是从文件的以前的采购。你只是你自己证明了这一点,当你取消它,并再次尝试相同的命令行。
您不能调用缓存......这是多么shell工作。您源的另一文件,它的所有定义都包含在当前的shell会话,呆在那里。如果你真的运行脚本(不采购),你不应该得到任何残留在当前会话中。
$ chmod +x hello_file
$ ./hello_file # note: executed, not sourced
$ hello
-bash: hello: command not found
其他提示
最有可能的解释是,你已经运行hello_file它是保护和功能已经被创建之前。然后你保护你的脚本(你说的命令100,但在你的文字提到000)。
因此,脚本将无法运行。但是,你好()仍然从你以前的运行定义。
尝试打开一个新的壳或刚刚执行unset hello
。
你将模式改变到100之前源脚本(即运行“ ./hello_file”)?如果是这样的话,那么,“你好”功能简直是仍然加载到庆典。随后试图源的不可读文件将不会改变。要正确测试,请确保您推出的新的外壳。
为了运行一个程序(不管它是一个bash脚本,或者二进制可执行文件),你需要有执行权限。当输入一个命令,第一个字(如在下面的./foo
)指定要运行的命令,并且被启动作为单独的进程;在一个外壳脚本的情况下,它执行对#!
行中列出的外壳解释器的一个新的副本,以及使用解释器运行的程序。
$ ls -l foo -rw-r--r-- 1 lambda lambda 23 Mar 25 20:02 foo $ chmod 744 foo # or chmod u+x foo $ ls -l foo -rwxr--r-- 1 lambda lambda 23 Mar 25 20:02 foo $ ./foo Hello
当使用.
命令,这是一个壳内建命令,指出到源文件到当前壳;这意味着它执行文件中的命令,如果你已经在命令行中运行它们,就在当前文件。你只需要读取权限源中的文件。例如,如果设置在子过程的变量,它不改变在当前壳的值;但是如果源bash脚本到当前壳,然后它改变值:
$ foo=bar $ cat setvariables #!/bin/sh foo=hello $ ./setvariables $ echo $foo bar $ . ./setvariables $ echo $foo hello
一个壳函数(像在您的示例)是很多像变量,但是它的作用就像在当前外壳的命令。所以,当你使用hello_file
源您.
,它定义在当前的外壳,功能,并且它可以执行像已定义的任何其它壳功能。
至于权限而言,我敢打赌,更改权限100之前(这意味着仅可执行,不可读,这是一个文件相当无用的,因为你需要能够读取它,它执行到做任何事),你已经将源文件导入到当前的shell。这将意味着该功能已经定义,它的定义后,不要紧的文件的权限;一旦该功能在当前shell定义,你甚至可以删除文件,只要该壳仍然是开放的,功能仍然会被定义。
编辑:我从你的编辑问题看,你一旦取消设置的功能,你会得到一个错误。这有力地表明,我认为我的假设是正确的,并且您已经源文件,你改变权限之前。正如我所解释的,采购和执行文件是完全不同的操作,一旦你源中的文件,它的权限(或存在)不要在所有问题;该功能已经被加载到当前运行的外壳。您可以通过执行unset hello
运行后你原来的实验告诉;如果chmod 000
它,则不应有读取权限,然后该函数将不被限定。