无法检测是否从脚本

时间:2017-05-03 17:06:08

标签: linux bash conditional

我有一个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!请帮忙。

2 个答案:

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