!['$ 和有什么不一样? foo' 和 '$ ./foo'?](https://linux22.com/image/61148/'%24%20%E5%92%8C%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E4%B8%80%E6%A0%B7%EF%BC%9F%20foo'%20%E5%92%8C%20'%24%20.%2Ffoo'%EF%BC%9F%20.png)
t
是一个简单的脚本以下两种情况有什么不同:
$ . t
和
$ ./t
答案1
. t
不会打开新的 shell 来运行 t,因此所有创建或修改的变量将在执行后保留。 t 将在 $PATH 中搜索,因此如果您想从当前所在的路径运行 t,命令应该是. ./t
./t
将执行 t ,该路径位于我们现在生成 shell 执行的路径中。
澄清一点。假设 t 包含:
#!/bin/bash
data=hello
后./t
你可以从命令行执行echo $data
,你不会得到任何东西,但是如果你运行. ./t
并运行,echo $data
你会在屏幕上收到一个问候语。
答案2
$ . somescript.sh
在这种情况下, the.
是 the 的同义词source
内置。它读取参数(somescript.sh
在我的示例中,t
在您的示例中),就像您在当前 shell 中键入这些命令一样。
$ ./somescript.sh
somescript.sh
正在其自己的 shell 中执行脚本。在这种情况下,.
用作可执行文件路径的相对部分。要在 Linux 和 Unix(以及 Windows,如果安装了 Bash)上的 Bash 中执行文件,您需要提供可执行文件的完整路径。使用./
作为路径的开头告诉 Bash 使用当前目录。
在第二种情况下,这就是从 Bash 中执行任何可执行文件的方式。在第一种情况下,该文件必须是 Bash 文件。
答案3
在同一 shell 中运行脚本的另一个显着效果是该exit
命令将退出您自己的 shell。脚本检查环境变量或文件是否存在是很常见的,例如:
if [ -z $JAVA_HOME ]; then
echo "JAVA_HOME variable is not set. Exit..."
exit 1
fi
如果您使用source
此脚本,您将无法看到错误(如果您没有设置 JAVA_HOME)。您的终端将关闭或 ssh 会话结束,或者如果您这样做了,您将回退到以前的用户su
,等等。
因此,最好默认在子 shell 中运行脚本,而不是获取它们。
答案4
点.
表示当前目录,因此 if是thent
中的一个简单脚本将给出结果,并生成错误,因为它不存在。/home/someuser
.t
/home/someusert
斜杠/
将给出脚本的正确路径,因此./t
将给出结果/home/someuser/t
,即脚本的正确路径