gpt4 book ai didi

linux - 使用 `sh` 和 `source` 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 12:34:40 25 4
gpt4 key购买 nike

shsource有什么区别?

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.(其中一个是另一个的别名。source cmd not POSIX - kind of bashism )时,您会加载并执行一个 shell 脚本 当前 shell 进程。所以你可以

  • 读取源脚本中设置的变量,
  • 使用其中定义的函数。
  • 如果脚本执行此操作,甚至可以执行 fork 和/或子进程。

当你调用 sh 时,你启动了一个运行 /新 session 的 fork(子进程或 child) bin/sh(通常是 bash 的符号链接(symbolic link))。在这种情况下,子脚本设置的环境变量会在子脚本终止时被删除。

警告:sh 可能是指向另一个的符号链接(symbolic link) .

实用样例

例如,如果你想通过特定的方式改变当前工作目录,你就做不到

$ 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 将在 subshel​​l 中运行。

但是:

$ 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 function !! (使用 补全基于关联数组)。

执行级别$SHVLV

$ 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.

Recursion (当脚本从自身运行时)

$ 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 ($$ == process Id) 与 SID ( session 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.\nsle' \
'ep 1;exit 0\n' >finalTest.sh

$ bash finalTest.sh
Ending this.

$ source finalTest.sh
Ending this.

... 您可能会注意到两种语法之间的不同 行为。 ;-)

关于linux - 使用 `sh` 和 `source` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com