`declare -F` 在 zsh 中不起作用

`declare -F` 在 zsh 中不起作用

declare -f显示 bash 和 zsh 中的函数定义。

$ declare -f
VCS_INFO_adjust () {
    # undefined
    builtin autoload -XUz
}
VCS_INFO_bydir_detect () {
    # undefined
    builtin autoload -XUz
}
VCS_INFO_check_com () {
    setopt localoptions NO_shwordsplit
    case $1 in
        (/*) [[ -x $1 ]] && return 0 ;;
        (*) (( ${+commands[$1]} )) && return 0 ;;
    esac
    return 1
}
....

declare -F显示函数名称是 bash,但在 zsh 中不是。

blueray@blueray-PC:~$ declare -F
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __git_eread
declare -f __git_ps1
declare -f __git_ps1_colorize_gitstring
declare -f __git_ps1_show_upstream
declare -f __grub_dir
declare -f __grub_get_last_option
....

其背后的原因可能是什么?

答案1

在Zsh中,declare -F声明一个双精度浮点变量

$ declare -F myvar
$ echo $myvar
0.0000000000

要列出 Zsh 中的所有函数名称,请使用typeset -f +.

在 中zsh$functions特殊的关联数组将函数名称映射到它们的定义,以便${(k)functions}扩展为该关联数组的 也将扩展到函数名称列表。

Bash 和 Zsh 是不同的 shell,您不能指望它们的行为完全相同。

答案2

declare是一个非标准的 shell 扩展。

bash您不能指望这在和中同样有效zsh

一般来说,如果您想在 shell 脚本中使用非标准扩展,请确保使用它们设计的 shell 并实现您期望的行为。换句话说:如果您想获得bash行为,请使用bashfr 您的脚本。

顺便说一句:您喜欢使用的功能不在POSIX

相关内容