Linux 上的 shell 函数存储在哪里?

Linux 上的 shell 函数存储在哪里?

起初,我正在寻找which在给它某些程序作为参数后不输出任何内容的原因,例如cd

据我所知这里,原因可能是cd在我的计算机上有一个函数,通过运行可以确认type cd

总结:which但是,由于可以通过变量定位的普通程序$PATH被放置在其中一个$PATH文件夹中,那么函数或脚本cd存储在哪里呢?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

答案1

用户定义函数

通常,bash 函数永久存储在bash启动脚本中。

  • 系统范围的启动脚本:/etc/profile用于登录 shell 和/etc/bashrc交互式 shell。
  • 用户定义启动脚本:~/.bash_profile用于登录shell和~/.bashrc交互式shell。
  • 有关交互式/登录 shell 的更多信息可以在 Bashman页面的 INVOCATION 部分中找到。

当 bash 启动时,用户定义的 shell 函数会动态加载到哈希表(或查找表)中。从 bash 源文件中,variable.c该表的定义如下:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

用户定义的函数可以用 bash 命令列出declare,其他 shell 仍然使用typeset。在 bash 中declare已经取代了该typeset命令。

declare -f

这些函数在 bash shell 的整个生命周期内都存在于内存中。

Shell 定义(内置)函数

这些是常用函数,例如echoprintf和。它们被编译成库,并链接到可执行文件中。与加载外部定义相比,将定义构建到可执行文件中可以节省时间。这些函数的定义(保存在解析为 C 源代码的源文件中)保存在bash 源代码目录中。cd:bash.defbuiltins

补充一点:有关 shell 内置命令的信息,请使用help <command>. 例如

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

答案2

功能存储在 shell 的内存中(或者,可能在未记录的临时文件中)。它们在 shell 启动之前(例如,当您登录到 CLI 或启动 shell 窗口(例如xterm)时)无法以任何可用方式存在,并且它们被定义(例如,通过读取.bashrc.bash_profile或类似内容)并且当 shell 终止时它们不再存在。

答案3

cd和其他常见命令,如echo, type&alias被称为内置

内置命令包含在 shell 本身中,不同的 shell 可能有不同的内置命令。

答案4

超级用户问题查找 Bash 函数的定义 与此密切相关。用户狗的毛假如这个答案(释义):

以下命令将报告函数定义的位置(文件名和行号)。假设函数名为foo

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

例如,这些命令的输出可能是:

foo 32 /source/private/main/developer/cue.pub.sh

上述操作可能仅在 中有效bash,而一般不适用于 POSIX shell。

谢谢蓝树莓找到这个!

相关内容