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

Gab*_*vić 11 linux bash shell-script

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

从我在这里发现的情况来看,原因可能是cd我的机器上有一个函数,通过运行type cd.

TLDR:但是由于which可以通过$PATH变量定位的普通程序放置在这些$PATH文件夹之一中,函数或脚本cd存储在哪里?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Run Code Online (Sandbox Code Playgroud)

sus*_*tus 13

用户定义函数

通常 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;
Run Code Online (Sandbox Code Playgroud)

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

declare -f
Run Code Online (Sandbox Code Playgroud)

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

Shell 定义(内置)函数

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

一个有用的旁白:有关 shell 内置命令的信息,请使用help <command>. 例如

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
Run Code Online (Sandbox Code Playgroud)


G-M*_*ca' 8

Shell函数存储在Shell的内存中(或者,可能存储在未记录的临时文件中)。他们不以任何方式使用存在,直到外壳程序启动(例如,当您登录到CLI或启动一个shell窗口等xterm)和它们被定义(例如,通过阅读.bashrc.bash_profile或类似的东西),他们不再当 shell 终止时存在。


Nif*_*fle 6

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

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

  • 我不知道是否值得强调像 `cd` 这样的内置命令的可执行代码包含在 shell 程序本身中,例如在文件 `/bin/bash` 中,如果那是你的 shell。(我确实认为你在这里的措辞很清楚,但我看到人们对各种各样的事情感到困惑。) (4认同)