它是不完全分辩,我可以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它,则不应有读取权限,然后该函数将不被限定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top