在 zsh 中编写函数的正确方法

在 zsh 中编写函数的正确方法

在处理项目时,我经常必须顺序运行这些命令git add --all; git commit -m "some commit message"; git push以将最近的工作推送到远程存储库。

我认为最好编写一个函数,封装这三个命令并将其放入我的.zshrc文件中,以便每次启动 shell 时都可以使用它。所以我写了下面的函数,

gp() {
    git add --all
    git commit -m "$*"
    git push
}

export -f gp

当我获取文件.zshrc或启动新的 shell 会话时。它抛出以下错误:

parse error near `()'

我已经在线检查了定义函数的正确语法,上面的函数对我来说看起来是正确的。我不知道如何解决此错误,将非常感谢您的帮助。

答案1

function-name() command

是 所支持的几种函数定义语法之一zsh,该语法来自 80 年代早期的 Bourne shell,因此这部分代码没问题。

如果您遇到parse error near `()'错误,很可能是因为解析器从一开始就不需要函数定义。

例如,这是您会遇到的错误:

case x in
gp() {
  body
}

与 after 一样case x in,zsh 需要 case 模式 或esac,而不是函数定义。

因此,问题可能出在您未显示的 zshrc 部分的某个位置。当脚本采用 MSDOS 行结尾(CRLF 而不是 LF)格式化时,例如在 Microsoft Windows 系统上编辑脚本时,也经常会出现语法错误。dos2unix可以用来修复这些问题。

除此之外,这export -f function-name是一个仅限 bash 的功能。

zsh没有与该危险功能等效的功能,尽管您可以通过在~/.zshenv.

"$*"这也是你会在sh/中做的事情bash,因为他们没有更好的方法来做到这一点。它将位置参数与 的第一个字符连接起来$IFS,无论当时是什么。在 中zsh,您可以明确指定在与参数扩展标志连接时使用什么分隔符,而不是将其留给掷骰子j${(j[ ])@}例如,用空格连接位置参数。

相关内容