首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zsh:"reload:4 = not“函数名为"reload”

zsh:"reload:4 = not“函数名为"reload”
EN

Stack Overflow用户
提问于 2022-06-09 21:36:52
回答 1查看 48关注 0票数 -1

我试图为自己创建一个快捷方式,以便在服务器上重新加载站点,因此我将通过regex获得站点名,然后让zsh运行一个命令,用正确的参数重新加载站点。

我试过很多种不同的方法,但是我不断地发现错误“不找到”,但我不明白。

代码语言:javascript
复制
function reload(){
    pwd=$(pwd) 
    [[ $pwd =~ .*\/custom\/.+\/(.+)(\/stage)? ]] && echo "$match[1]"
    read -q "REPLY?rc $match[1].stage reload"
    if[REPLY == ""] then
    cmd="rc $match[1].stage reload"
    $=cmd
}

一切都正常直到最后1-2行。

预期产出:rc somesite.stage reload // then enter runs this command in zsh

实际产出:

代码语言:javascript
复制
$ currentDir % reload  
currentDirSiteName
rc currentDirSiteName.stage reload
reload:4: = not found
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-10 07:47:43

要解释错误消息,请执行以下操作:

你有这条线

代码语言:javascript
复制
if[REPLY == ""] then

根据zsh的解析规则,像A B C这样的行在空格上被打断(当然是关于引用),第一个单词(即A)作为命令执行,而其他单词是参数。在你的例子中,打破空格会产生四个单词

代码语言:javascript
复制
if[REPLY
==
""]
then

首先,我们看到您很可能没有一个名为if[REPLY的命令。这本身就已经是一个错误,但是zsh提前退出:甚至在尝试运行命令之前,它必须准备参数:

第一个参数是==,以=符号开头的参数在zsh中进行特殊扩展:对于单词=foo,shell试图定位名为foo的可执行文件,并将单词替换为该可执行文件的绝对路径。您可以通过键入echo =cat来尝试这一点,它将输出类似于/usr/bin/cat的内容。在您的例子中,在=符号之后的是另一个=符号。因此,zsh试图在您的路径中找到一个名为=的程序,但是没有成功。这是错误消息的原因。

如果你写的是

代码语言:javascript
复制
if [[ $REPLY == "" ]]; then

shell应该已经认识到您有一个if (这是一个语法构造)。在if之后,它需要一个命令。[[ ... ]]是一个内部命令,用于计算某些类型的表达式,在这个结构中,应用不同的解析规则。因此,==并不经历前面描述的扩展过程,而是被理解为测试等式的操作符。

顺便说一句,更惯用的方式是写

代码语言:javascript
复制
if [[ -z $REPLY ]]; then
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72566918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档