为什么某些属于 shell 函数的 shell 命令并不总是可用?

为什么某些属于 shell 函数的 shell 命令并不总是可用?

我注意到使用 zshhistory从 Emacs 通过 执行时该命令不可用shell-command

history | grep runserver结果是zsh:fc:1: no such event: 1

我也使用histdb来自的命令https://github.com/larkery/zsh-histdb尽管该命令可以从 zsh 获得,但不能从 Emacs 调用。

histdb --limit 2000 | grep runserver输出zsh:1: command not found: histdb

显然,我不明白 shell 的核心方面。

需要什么来解决这些问题?

这种现象不仅仅存在于 Emacs 中。当我运行远程 ssh 命令时,例如出现相同的错误消息。ssh [email protected] 'histdb --limit 2000'

答案1

我的 zsh 没有histdb命令,所以我必须假设它确实是一个函数而不是内置命令。

Shell 函数由源脚本加载,通常是您的个人初始化脚本或系统级初始化脚本。有多个这样的脚本,并且它们并非在所有情况下都运行,因此如果在错误的脚本中定义该函数,则该函数在某些情况下可能不可用。

此外,init 脚本可以检测 shell 运行的环境并有条件地加载部件。也许由于某种原因,当您在 emacs 中运行 zsh 时,它不会加载在 emacs 之外运行时获得的所有函数。

可以肯定的是,我们必须知道函数是从哪个文件加载的,以及该文件中的定义之前是否有任何条件代码。

相关内容