当您调用source
or时.
(一个是另一个的别名。cmdsource
不是 POSIX 类型的bashism),您将 bash 脚本加载并执行到当前bash 进程中。这样你就可以
- 读取源脚本中设置的变量,
- 使用其中定义的函数。
- 如果脚本执行此操作,甚至执行分叉和/或子进程。
当您调用 时sh
,您会启动一个运行新会话的fork(子进程或子/bin/sh
进程),该会话通常是指向 的符号链接bash
。在这种情况下,由子脚本设置的环境变量将在子脚本完成时被删除。
注意:sh
可能是另一个shell 的符号链接。
实用样本
例如,如果您想通过特定方式更改当前工作目录,则无法执行
$ cat <<eof >myCd2Doc.sh
#!/bin/sh
cd /usr/share/doc
eof
$ chmod +x myCd2Doc.sh
这不会像你期望的那样:
$ cd /tmp
$ pwd
/tmp
$ ~/myCd2Doc.sh
$ pwd
/tmp
因为当前工作目录是 environment 的一部分,并且myCd2Doc.sh
会在subshell中运行。
但:
$ cat >myCd2Doc.source <<eof
# Shell source file
myCd2Doc() {
cd /usr/share/doc
}
eof
$ . myCd2Doc.source
$ cd /tmp
$ pwd
/tmp
$ myCd2Doc
$ pwd
/usr/share/doc
看看mycd
功能!!(使用基于Associative Array的bash完成)。
执行级别$SHLVL
$ cd /tmp
printf %b '\43\41/bin/bash\necho This is level \44SHLVL.\n' >qlvl.sh
$ bash qlvl.sh
This is level 2.
$ source qlvl.sh
This is level 1.
递归(当脚本从自身运行时)
$ cat <<eoqlvl2 >qlvl2.sh
#!/bin/bash
export startLevel recursionLimit=5
echo This is level $SHLVL started:${startLevel:=$SHLVL}.
(( SHLVL < recursionLimit )) && ./qlvl2.sh
eoqlvl2
$ chmod +x qlvl2.sh
$ ./qlvl2.sh
This is level 2 started:2.
This is level 3 started:2.
This is level 4 started:2.
This is level 5 started:2.
$ source qlv2.sh
This is level 1 started:1.
This is level 2 started:1.
This is level 3 started:1.
This is level 4 started:1.
This is level 5 started:1.
再远一点
$ sed '$a ps --sid $SID fw' qlvl.sh >qlvl3.sh
$ chmod +x qlvl3.sh
$ export SID
$ read SID < <(ps ho sid $$)
$ echo $SID $$
8983 8983
(当前PID($$
==进程 ID )与SID(会话 ID)具有相同的标识符。并非总是如此。)
$ ./qlvl3.sh
This is level 2.
PID TTY STAT TIME COMMAND
8983 pts/10 Ss 0:00 /bin/bash
10266 pts/10 S+ 0:00 \_ /bin/bash ./qlvl3.sh
10267 pts/10 R+ 0:00 \_ ps --sid 8983 fw
$ . qlvl3.sh
This is level 1.
PID TTY STAT TIME COMMAND
8983 pts/10 Ss 0:00 /bin/bash
10428 pts/10 R+ 0:00 \_ ps --sid 8983 fw
点.
是 的别名source
。因此,两个命令之间的唯一区别被slash
替换为space
.
最后的测试:
$ printf %b '\43\41/bin/bash\necho Ending this.\nsleep 1;exit 0\n' >finalTest.sh
$ bash finalTest.sh
Ending this.
$ source finalTest.sh
Ending this.
...您可能会注意到两种语法之间的不同行为。;-)