在处理我前同事编写的bash项目时,我注意到所有的.sh文件都只包含以
然而,如果我不使用
#!/bin/false
开头的函数定义。据我所知,这是一种安全机制,可以防止仅包含引用的文件被执行。
示例:
my_foo.sh#!/bin/false
function foo(){
echo foontastic
}
my_script.sh
#!/bin/bash
./my_foo.sh # does nothing
foo # error, no command named "foo"
. ./my_foo.sh
foo # prints "foontastic"
然而,如果我不使用
#!/bin/false
,正确使用和错误使用的效果是完全相同的:
例子:
my_bar.sh
function bar(){
echo barvelous
}
my_script.sh
#!/bin/bash
./my_bar.sh # spawn a subshell, defines bar and exit, effectively doing nothing
bar # error, no command named "bar"
. ./my_bar.sh
bar # prints "barvelous"
既然在两种情况下都通过使用source
正确地包含这些脚本可以按预期工作,并且从父shell的角度来看,在两种情况下执行它们不会产生任何效果,也不会生成关于无效使用的错误消息,那么这些脚本中的#!/bash/false
究竟是什么目的呢?
false
shebang,脚本内容就不会被执行。这是一种安全保障,以防脚本在错误的上下文或资源繁重的情况下出错。很可能,这是你同事养成的习惯,在大多数情况下对代码没有影响,但在更复杂的情况下可能会有用。 - Aserrebash my_script.sh
),she-bang行#!/bin/true
或#!/bin/false
对脚本没有影响,这个语法无论如何都会使用bash
运行脚本并输出foontastic
。 - Inian./my_bar.sh
不会生成子shell:它会生成一个全新的shell。这不仅仅是技术上的细节:子shell会接收到主shell的所有变量的副本(包括那些没有标记为导出的变量),而单独的shell只会接收到导出的变量。子shell可以通过其他方式启动,例如通过括号()
、管道|
、进程/命令替换$()
<()
>()
等。 - Fred