我知道.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"