'$ 和有什么不一样? foo' 和 '$ ./foo'?

'$ 和有什么不一样? foo' 和 '$ ./foo'?

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.shsomescript.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,即脚本的正确路径

相关内容