我有一个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
!请帮忙。
答案 0 :(得分:2)
除非它们已使用export -f
导出,否则函数是shell的单个实例的本地。您的脚本在不同的实例中运行。
如果您希望您的命令能够确定哪些shell函数是活动的,您应该将其写入现有的shell而不是作为外部命令执行,或者将其定义为shell函数本身。
如果您愿意处理脚本的行为被其副作用修改,您也可以使用.bashrc
来源:
brc="$HOME/.bashrc"
[[ -e "$brc" ]] && source "$brc"
答案 1 :(得分:1)
默认情况下,不会为非交互式shell加载.bashrc
,例如,这来自我的(默认).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
(取决于在系统中检查它的方式)或从另一个文件中获取函数。