我有一个 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
命令用于像处理文件一样处理某些过程的输出。文档