. .bash_profile 和 . ./.bash_profile (./ 和 .)

. .bash_profile 和 . ./.bash_profile (./ 和 .)

我知道.bash_profile这是一个隐藏文件,因此前面有一个句号。

我理解在当前目录下执行脚本。您必须指定./,但我不确定,为什么因为我们已经在当前目录中,并且脚本在当前目录中。

q1)为什么还必须这样./?我们可以只放脚本名称吗?

q2). bash_profile和有什么区别. ./.bash_profile?是.指当前目录还是.= sourcing ?

==================================

附加问题

以下是我的路径

[oracle@SJOAM scripts]$ echo $PATH
.:/usr/local/java/bin:/usr/local/java/db/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/u01/app/oracle/product/11.2.0/dbhome_1/bin:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin:/u01/app/oracle/dba_scripts/bin

如您所见,它没有以 : 结尾,并且后面没有空格。我现在在目录中

[oracle@SJOAM bin]$ cd ~/scripts
[oracle@SJOAM scripts]$ pwd
/home/oracle/scripts
[oracle@SJOAM scripts]$ ls
rmanbkp.sh  test.sh

但是我仍然能够执行 test.sh,而无需指定 ./test.sh /home/oracle/scripts 不在我的 $PATH 内

=============================

Q1)为什么我不指定 ./ 仍然能够执行脚本?

Q2)如果我的 $PATH 中有不存在的目录,是否会继续搜索 PATH 的其余部分?

Q3) $PATH = 当前目录中是否存在无效目录?

答案1

问题1

如果指定命令时没有指定目录,则会在 PATH 中搜索该命令。如果在 PATH 中找不到该命令,则会发出错误消息。这是为了您的安全。

如果命令指定了路径,那么 shell 会假定您知道自己在做什么并运行该命令。

有时,人们会将当前目录放在 PATH 中。PATH 是一个以冒号分隔的目录列表。如果其中一个目录为空,则将其解释为当前目录。例如,在此 PATH 中,最后一个冒号后的空格被解释为当前目录:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:

有了这样的 PATH,您可以在当前目录中执行命令,而无需./在其名称前面指定。但请注意,这有时可能会导致不愉快的意外。

第二季度

是的,前导点空格意味着来源脚本。获取脚本意味着它在当前 shell 中运行,而不是在子 shell 中运行。获取脚本可以更改当前环境。子 shell 中的脚本不能。以下两个命令是等效的:

source ~/.bashrc
. ~/.bashrc

总结一下,(1) 命令行上的前导点空格表示“源脚本”;(2) 文件名上的前导点表示文件被隐藏。这两种点的用法是分开且独立的。

问题 1

PATH 中的第一个目录是.当前目录。这就是为什么您无需指定目录即可在当前目录中执行脚本。

因为首先指定了当前目录,所以该 PATH 特别危险:这意味着当前目录下的任何脚本都将优先于/bin/usr/bin等中的所有标准可执行文件。这可能会导致任何期望能够运行常规可执行文件的程序失败。

第二季度

nonsense让我们通过将一个不存在的目录添加到 PATH 来进行测试:

$ type date
date is hashed (/bin/date)
$ export PATH=/usr/bin/:nonsense:/bin
$ hash -r  # delete the cache
$ date
Thu Jul  9 11:13:18 PDT 2015

无效路径将被忽略,并继续搜索 PATH 列表中的下一个元素。

第三季度

不,PATH 上的错误目录不会被解释为当前目录。例如:

$ export PATH=/usr/bin/:nonsense
$ date
bash: date: command not found
$ cd /bin
$ date
bash: date: command not found
$ ./date
Thu Jul  9 11:17:34 PDT 2015

答案2

文件名.bash_profile以点为前导。

将文件导入当前 shell 的命令是.(点)

因此,您想要. .bash_profile-- (command="." ;argument=".bash_profile"`)

另一种说法可能更明显:

filename=".bash_profile"
. "$filename"

相关内容