无法检测 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
(取决于它在您的系统中的检查方式)或从另一个文件获取函数。
我有一个 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
(取决于它在您的系统中的检查方式)或从另一个文件获取函数。