无法检测 shell 函数是否由脚本定义

Can't detect whether a shell function is defined from a script

我有一个 bash 脚本,它应该检查用户是否定义了函数,如果不存在函数,将在他们的 ~/.bashrc 文件中定义函数。为了显示目的,我简化了代码。这是脚本:

#!/bin/bash

brc="$HOME/.bashrc"

exists=false

# check if the function exists
if [ -n "$(type -t cs)" ] && [ "$(type -t cs)" = function ]; then 
    exists=true 
fi

if [ "$exists" = false ]; then
    echo "true"
else
    echo "false"
fi

通过大量 echo 测试,我发现无论调用 cs 的函数对我是否存在,第一个条件语句的计算结果总是 false。奇怪的是,当我在没有 运行 脚本的情况下直接将这些行复制并粘贴到我的 shell 中时,该行的计算结果为 true!请帮忙。

除非它们已使用 export -f 导出,否则函数是 局部于 shell 的单个实例。您的脚本在不同的实例中运行。

如果您希望您的命令能够确定哪些 shell 功能处于活动状态,您应该将其写入现有的 shell 而不是作为外部命令执行,或者将其定义为 shell 函数本身。

如果您愿意处理因脚本的副作用而修改的脚本行为,您也可以在 .bashrc 中找到来源:

brc="$HOME/.bashrc"
[[ -e "$brc" ]] && source "$brc"

默认情况下 .bashrc 不会为非交互式 shell 加载,例如这是来自我的(默认).bashrc:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

或者您可能有类似的东西:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

因此您需要弄清楚如何在非交互式 shell 中加载 .bashrc(取决于它在您的系统中的检查方式)或从另一个文件获取函数。