微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Shell 脚本中 Dot(`.`)/Source 命令的参数

如何解决Shell 脚本中 Dot(`.`)/Source 命令的参数

我很困惑...我知道 . 不是 POSIX 文件通配符扩展字符,如 *?[][!]。引用 Arnold Robbins and Nelson H. F. Beebe. Classic Shell Scripting: Hidden Commands that Unlock the Power of Unix (p. 240). O'Reilly Media. Kindle Edition.

MS-DOS、MS-Windows 和 OpenVMS 用户应该注意什么都没有 Unix 文件名中的点 (.) 的特殊之处(除了前导 点,它“隐藏”了文件);这只是另一个角色。为了 例如,ls * 列出当前目录下的所有文件;你不需要 .就像在其他系统上一样。

我还知道当前 shell 中的点 (.)(或 source)命令源文件。例如,给定

#! /bin/sh
# file1.sh -- File to be sourced

a='123'

如果我跑

$ ./file1.sh

在终端中,我没有得到 $a,因为我在子 shell 中执行了 file1.sh

$ echo $a

$

但如果我改为运行

$ . file1.sh

然后我得到 $a

$ echo $a
123
$

但是,为什么我需要在第二个脚本中使用点命令,例如 . ./file1.sh 而不是命令行 . file1.sh 上的 like?我知道点命令搜索 $PATHfile1.sh,但我认为文件路径中的“点”不是 POSIX 通配符扩展(即不代表当前目录)。

如果在我的文件夹中我有 file1.shfile2.sh 以及 file2.sh

#! /bin/sh

. file1.sh

然后我从终端的那个目录运行以下命令,我得到

$ ./file2.sh
./file2.sh: line 3: .: file1.sh: file not found

但是如果我跑了

$ . file2.sh

现在我得到了 $a

$ echo $a
123

此外,如果我将 file2.sh 更改为

#! /bin/sh
# file2.sh

# I don't kNow why this works...?
. ./file1.sh

然后我可以像第一种方式一样运行脚本并且它可以工作:

$ ./file2.sh
$ echo $a
123

有人可以向我解释这里发生了什么吗?

更新:

我相信摘录的文本可能指的是文件扩展名,而不是当前工作目录符号。上面的摘录是文本中的内容(第 239 页):

如果您接触过简单的命令行环境 在 MS-DOS 下可用,您可能熟悉 *.* 通配符 匹配当前目录中的所有文件名。 Unix外壳 通配符类似,但功能更强大。

Windows 使用文件扩展名的概念来确定使用什么程序来运行文件,但 Linux 没有。在 MS-DOS 中,搜索 *.* 形式的内容会返回一个文件,而在 Linux 中,它可能是一个文件或目录。事实上,作为一个例子,Linux 中的几个文件夹以 .d 结尾,表示它是一个包含“守护程序脚本”的文件夹。相比之下,在 Linux 上,shell 可以通过扫描文件顶部的 shebang(例如 #! /bin/sh)来确定用于运行文件的程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。