起初,我正在寻找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 的更多信息可以在 Bash
man
页面的 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 定义(内置)函数
这些是常用函数,例如echo
、printf
和。它们被编译成库,并链接到可执行文件中。与加载外部定义相比,将定义构建到可执行文件中可以节省时间。这些函数的定义(保存在解析为 C 源代码的源文件中)保存在bash 源代码目录中。cd
:
bash
.def
builtins
补充一点:有关 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。
谢谢蓝树莓找到这个!