使用`sh`和`source`有什么区别?
sh
和之间有什么区别source
?
source: source filename [arguments] Read and execute commands from FILENAME and return. The pathnames
in $PATH are used to find the directory containing FILENAME. If any
ARGUMENTS are supplied, they become the positional parameters when
FILENAME is executed.
对于man sh
:
NAME bash - GNU Bourne-Again SHell
SYNOPSIS
bash [options] [file]
COPYRIGHT
Bash is Copyright (C) 1989-2004 by the Free Software Foundation, Inc.
DESCRIPTION
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates
useful features from the Korn and C shells (ksh and csh).
Bash is intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
回答:
调用source
(或其别名.
)时,您将bash脚本加载并执行 。所以你可以
- 读取在源脚本中设置的变量,
- 使用其中定义的功能。
- 甚至在脚本执行的情况下执行fork和/或子进程。
调用时sh
,您将启动一个 fork (子进程或 子 进程),该 fork
运行新的会话/bin/sh
,通常是的符号链接bash
。在这种情况下,子脚本完成时将删除由子脚本设置的环境变量。
:sh
可能是到 另一个 外壳的符号链接。
一个小样本
例如,如果要通过特定方式更改 当前工作目录 ,则无法执行
$ cat <<eof >myCd2Doc.sh#!/bin/sh
cd /usr/share/doc
eof
$ chmod +x myCd2Doc.sh
这不会达到您的期望:
$ cd /tmp$ pwd
/tmp
$ ~/myCd2Doc.sh
$ pwd
/tmp
因为 当前的工作目录 是环境的一部分,并且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
函数示例(基于 bash
Associative Array的 bash完成)。 __
执行水平 $SHLVL
$ cd /tmpprintf %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
echo This is level $SHLVL started:${startLevel:=$SHLVL}.
((SHLVL<5)) && ./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.
…您可能会注意到两种语法之间的行为 有所不同 。;-)
以上是 使用`sh`和`source`有什么区别? 的全部内容, 来源链接: utcz.com/qa/402764.html