Linux Can';t检测是否从脚本定义了shell函数
我有一个bash脚本,它应该检查用户是否定义了一个函数,如果没有函数存在,它将在他们的Linux Can';t检测是否从脚本定义了shell函数,linux,bash,conditional,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=tru
~/.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"
除非它们是使用
export-f
导出的,否则函数是shell的单个实例的本地函数。您的脚本在不同的实例中运行
如果希望命令能够确定哪些shell函数处于活动状态,则应将其写入现有shell,而不是作为外部命令执行,或者将其定义为shell函数本身
如果您愿意处理脚本的行为因其副作用而被修改,您也可以在.bashrc
中获取源代码:
brc="$HOME/.bashrc"
[[ -e "$brc" ]] && source "$brc"
默认情况下,不会为非交互式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
(取决于在系统中的检查方式),或者从另一个文件中获取函数。默认情况下。对于非交互式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
(取决于在系统中的检查方式),或者从另一个文件中获取函数。bash-x您的脚本
是您的朋友……也就是说,函数不会从父进程继承,除非您导出它们,因此,当您运行脚本时,它无法知道哪些函数在交互式shell中定义或未定义。但是,OP在.bashrc
中定义了该函数,并且在获取该函数后,该函数应可用于脚本,对吗?@Inian,当然--如果他们修改了脚本以获取该文件的源代码。@CharlesDuffy:虽然所做的源代码是显式的,但现在看来,它还没有完成bash-x yourscript
是您的朋友……也就是说,函数不会从父进程继承,除非您导出它们,所以当您运行脚本时,它无法知道哪些函数在交互式shell中定义或未定义。但是,OP在.bashrc
中定义了该函数,并且在获取该函数的源代码后,该函数应可用于脚本,对吗?@Inian,当然-如果他们修改了脚本以获取该文件的源代码。@CharlesDuffy:认为所做的源代码是明确的,现在看来,在我的.bashrc
文件中定义函数后,将export-f cs
添加到我的.bashrc
文件中是否存在任何问题?在环境中是否有重复定义cs
的情况?不,每个函数有一个环境变量,因此在这方面是安全的。导出函数的唯一真正原因是,由于shellshock,格式发生了变化,因此如果使用不同版本的bash(这在OS X上非常常见,因为它的股票非常古老),一个导出的函数可能无法被另一个识别。在其中定义函数后,将export-f cs
添加到my.bashrc
文件中是否存在任何问题?在环境中是否有重复定义cs
的情况?不,每个函数有一个环境变量,因此在这方面是安全的。导出函数的唯一真正问题是,由于shellshock,格式已经改变,因此如果使用不同版本的bash(因为它的基本版本非常古老,所以在OS X上非常常见),一个导出的函数可能无法被另一个识别。