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).
5条答案
按热度按时间zaq34kh61#
当您调用
source
或.
(一个是另一个的别名。source
cmd不是POSIX. -类似于 bashism)时,您将在 * 当前 * shell进程中加载并执行一个shell脚本。当您调用
sh
时,您启动了一个 fork(子进程或 child),该进程运行/bin/sh
的新会话(通常是指向bash
的符号链接)。在这种情况下,由子脚本设置的环境变量将在子脚本终止时被删除。注意事项:
sh
可以是到 * 另一个 * shell符号链接。实际样品
例如,如果要通过特定方式更改 * 当前工作目录 *,则不能执行以下操作
这不会如您所愿:
因为 * 当前工作目录 * 是环境的一部分,并且
myCd2Doc.sh
将在 * 子shell * 中运行。但是:
请看一下
mycd
function!!(带有基于 * 关联数组 * 的bash完成)。执行级别
$SHLVL
Recursion(当脚本从自身运行时)
再远一点
(当前 PID(
$$
== * 进程ID*)与 SID(* 会话ID*)是相同标识符。它不总是正确的。)点
.
是source
的别名。因此,两个命令之间的唯一区别是 *slash
* 替换为 *space
*。最后一项测试:
...您可能会注意到这两种语法之间的 * 不同 * 行为。- )
sq1bmfud2#
主要区别在于它们在不同的进程中执行。
因此,如果您对执行
cd
的文件foo
执行source
操作,sourcing shell(例如,终端中的交互式shell)将受到影响(并且其当前目录将更改)如果您执行
sh foo
,则cd
不会影响sourcing shell,只会影响运行foo
的新创建的sh
进程读取Advanced Bash Scripting Guide。
这种差异并不是Linux特有的;每一个Posix系统都有它。
eagi6jfj3#
正如其他人所提到的,当运行
sh test.sh
时,test.sh
对shell环境所做的任何更改在进程结束后都不会保留。但是,还要注意,当
test.sh
作为子进程执行时(例如,使用sh test.sh
),test.sh
中的代码将无法使用环境中未导出的任何元素(例如,变量、别名和shell函数)。例如:
例二: