我试图为自己创建一个快捷方式,以便在服务器上重新加载站点,因此我将通过regex获得站点名,然后让zsh运行一个命令,用正确的参数重新加载站点。
我试过很多种不同的方法,但是我不断地发现错误“不找到”,但我不明白。
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
实际产出:
$ currentDir % reload
currentDirSiteName
rc currentDirSiteName.stage reload
reload:4: = not found发布于 2022-06-10 07:47:43
要解释错误消息,请执行以下操作:
你有这条线
if[REPLY == ""] then根据zsh的解析规则,像A B C这样的行在空格上被打断(当然是关于引用),第一个单词(即A)作为命令执行,而其他单词是参数。在你的例子中,打破空格会产生四个单词
if[REPLY
==
""]
then首先,我们看到您很可能没有一个名为if[REPLY的命令。这本身就已经是一个错误,但是zsh提前退出:甚至在尝试运行命令之前,它必须准备参数:
第一个参数是==,以=符号开头的参数在zsh中进行特殊扩展:对于单词=foo,shell试图定位名为foo的可执行文件,并将单词替换为该可执行文件的绝对路径。您可以通过键入echo =cat来尝试这一点,它将输出类似于/usr/bin/cat的内容。在您的例子中,在=符号之后的是另一个=符号。因此,zsh试图在您的路径中找到一个名为=的程序,但是没有成功。这是错误消息的原因。
如果你写的是
if [[ $REPLY == "" ]]; thenshell应该已经认识到您有一个if (这是一个语法构造)。在if之后,它需要一个命令。[[ ... ]]是一个内部命令,用于计算某些类型的表达式,在这个结构中,应用不同的解析规则。因此,==并不经历前面描述的扩展过程,而是被理解为测试等式的操作符。
顺便说一句,更惯用的方式是写
if [[ -z $REPLY ]]; thenhttps://stackoverflow.com/questions/72566918
复制相似问题