Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Can';t检测是否从脚本定义了shell函数_Linux_Bash_Conditional - Fatal编程技术网

Linux Can';t检测是否从脚本定义了shell函数

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

我有一个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"

除非它们是使用
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上非常常见),一个导出的函数可能无法被另一个识别。