如何解决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?我知道点命令搜索 $PATH
为 file1.sh
,但我认为文件路径中的“点”不是 POSIX 通配符扩展(即不代表当前目录)。
如果在我的文件夹中我有 file1.sh
和 file2.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 举报,一经查实,本站将立刻删除。