为什么我应该执行的某些命令的开头有多余的点

为什么我应该执行的某些命令的开头有多余的点

我已经下载了weblogic服务器的安装包,在README中,有这样的命令需要执行:

Linux/Mac
$ . ./configure.sh

这不是我第一次看到这种情况。为什么命令开头有一个额外的点?当我只这样做时./configure.sh,结果是一样的

答案1

点 ( .) 是从文件执行命令的符号,它作为点的参数给出。例如,该文件的内容./configure.sh在当前 shell 中执行。点命令起源于 Bourne shell,并且在其他 shell 中也可用,例如在 Bash 中。

摘自 Bash 的手册页

    .  filename [arguments]
source filename [arguments]
    Read  and  execute  commands from filename in the current shell
    environment and return the exit status of the last command executed from
    filename.  If filename does not contain a slash, file names in PATH are  used
    to  find  the directory  containing  filename.  The file searched for in PATH
    need not be executable.  When bash is not in posix mode, the current directory
    is searched if no file is found in PATH.   If  the  sourcepath  option  to  the
    shopt builtin  command  is  turned  off, the PATH is not searched.  If any
    arguments are supplied, they become the posi‐ tional parameters when filename
    is executed.  Otherwise the positional parameters are unchanged.  The return
    status is the status of the last command exited within the script (0 if no
    commands are executed), and false if filename is not found or cannot be read.

笔记:其他 shell 例如csh具有类似的 command source,并且许多更现代的版本都支持点表示法和命令source。 Bash 实际上两者都支持。

例子

下面是一个示例,我们将$SOMEVAR通过获取定义了该变量的文件来在当前 shell 中设置该变量。

这是示例文件:

$ cat test.sh 
SOMEVAR="hi"

首先,我们检查以确保$SOMEVAR当前 shell 中尚未设置该变量。

$ echo $SOMEVAR

$

现在我们获取它,并确认它现在已设置:

$ . ./test.sh 
$ echo $SOMEVAR
hi

可移植性

感谢@ChrisDown 提到这一点。点 ( .) 被指定为 POSIX 的一部分,因此是可移植的,而命令则source不然。请参阅此处The Open Group 基本规范第 7 期文档,部分:“2. Shell 命令语言”。具体来说就是这一段。

摘抄

姓名

点 - 在当前环境中执行命令

概要

。文件

描述

shell 应在当前环境中执行文件中的命令。

如果文件不包含 ,shell 将使用 PATH 指定的搜索路径来查找包含文件的目录。然而,与普通命令搜索不同的是,点实用程序搜索的文件不需要是可执行的。如果没有找到可读文件,非交互式 shell 将中止;交互式 shell 应将诊断消息写入标准错误,但这种情况不应被视为语法错误。

相关内容