鱼脚本可以区分来源脚本和执行脚本吗?

鱼脚本可以区分来源脚本和执行脚本吗?

我有一个 fish 脚本,它导出一些变量并在最后启动一个命令。我希望能够获取此文件以将这些变量带入当前 shell 会话,但不执行最后的命令。

问题:我能否确定当前文件是否正在执行或是源自文件内部?

答案1

您可以使用$_环境变量来查看您的脚本是否正在通过以下source命令“运行”:

#!/bin/fish
if test "$_" = source
  echo got sourced
else
  echo was execed
end

答案2

您可以使用$_环境变量来查看您的脚本是否由命令“运行” source。请注意,该source命令有一个通用别名(“ .”),因此您必须$_根据source和检查环境变量.

#!/bin/fish

if test "$_" != "source" -a "$_" != "."
    echo "not sourced"
else
    echo "was sourced"
end

一个常见的用途可能是当且仅当脚本没有来源时向用户发出警告:

if test "$_" != "source" -a "$_" != "."
    echo "Run this script with \". ./activate.fish\" (aka: \"source ./activate.fish\")."
    exit 1
end

activate.fish当然,用你的脚本名称替换。

答案3

我认为你误解了“source”脚本的作用。通常,执行脚本会在单独的进程中运行它。source 脚本会在当前外壳。它仍会执行每一行。

您可能想要过滤掉最后一行。尝试:

source (sed '$d' filename | psub)

psub命令用于像处理文件一样处理某些过程的输出。文档

相关内容