Shell 如何以不同的方式自动完成每个参数?

Shell 如何以不同的方式自动完成每个参数?,shell,zsh,Shell,Zsh,我有一个名为load_pg的函数,它的定义如下: load_pg () { pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $1 -d $2 $3 } 我试图用以下代码自动完成每个参数: #compdef load_pg _arguments -s \ "1::_ldpguser" \ "2::_ldpgdb" \ "3::_ldpgfile" _ldpguser () { compad

我有一个名为load_pg的函数,它的定义如下:

load_pg () {
    pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $1 -d $2 $3
}
我试图用以下代码自动完成每个参数:

#compdef load_pg
_arguments -s \
  "1::_ldpguser" \
  "2::_ldpgdb" \
  "3::_ldpgfile"

_ldpguser () {
  compadd $USER
}

_ldpgdb () {
  compadd $(cat config/database.yml | grep -i database | awk '{print $2}')
}

_ldpgfile () {
  compadd $(ls *.dump*)
}

不幸的是,当我按TAB键时,什么也没有发生。我做错了什么?我试着使用了

中的代码,我想说,
$USER
没有定义。在函数中使用几乎空白的
~/.zshrc
,TAB什么也不做-如果我定义
USER=“foobar”
,TAB将完成:
加载\u pg foobar cat:config/database.yml:没有这样的文件或目录
。另外请注意,除非您自动加载
\u ldpg{USER,db,file}
,当
\u arguments
尝试调用它们时,它们是未知的-我会将这些函数定义放在对
\u arguments
的调用之上。如果这还不够,请告诉我,我会采取适当的措施为您找到解决方案。您可以尝试
函数-t\u ldpguser
跟踪函数的执行情况。这将有助于您确定哪里出了问题。