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
行为,请使用bash
fr 您的脚本。
顺便说一句:您喜欢使用的功能不在POSIX