为什么这个点命令的行为与同一脚本的源命令不同?

为什么这个点命令的行为与同一脚本的源命令不同?

根据 bash 手册页和其他在线资源,source 命令和点在对现有脚本执行 source 操作时的行为应该完全相同,但我观察到的情况并非如此。请考虑以下脚本,它回显一条指示变量是否已设置的语句。

#! /bin/bash

if [[ -v MY_VAR ]]; then
  echo "source-test.bash already sourced"
  return
fi

export MY_VAR=YES

执行结果如下。

echo $MY_VAR

source source-test.bash
source source-test.bash
source-test.bash already sourced  <---- echoed from the script as expected
. source-test.bash
/home/foobar/bin    <--- Why is it printing the current directory instead of echoing the output message?

预期结果 第一次执行脚本后,无论我使用 source 还是点或 source 命令执行脚本,我都希望回显字符串“source-test.bash already sourced”。为什么当我使用点而不是 source 时会回显主目录?

答案1

显然,我从同事的 bash 配置文件中复制了一些内容,并使用了一些有用的别名,并将句点别名为pwd。我从未注意到这个微妙的别名定义。过去我使用过该source命令,只有在我尝试使用点代替源命令后,我才意识到这个别名的存在。

.bashrc那里

alias .='pwd'

其中一位评论者建议我运行以下命令来确定是否 .已将某个命令别名化。这是一个很好的技巧,在命令未按预期工作的其他情况下会很有用。有时,创建别名时,您可能会使用字母组合或当时没有意识到的字母与实际命令或程序名称相冲突。

type -a .

这就是促使我通过从文件中删除别名来解决问题的原因.bashrc

相关内容