为什么我不能在 bash 函数中使用“z”命令?

为什么我不能在 bash 函数中使用“z”命令?

我想要完成的是:跳转到一个目录并列出其内容。

我在 .bash_aliases 中添加的 bash 函数是:

function zl(){
  
  z $1 && ls
}

但是,当调用此函数时,我收到以下错误:

❯ zl node
z: command not found

但当我单独使用 z 命令时,它可以完美地工作。

为什么我不能在函数内使用 z 命令?

我尝试过的修复:

  1. 将源 /home/me/z.sh 添加到函数中
function zl(){
  source /home/nair/z.sh
  z $1 && ls
}

编辑:z 是跳转命令

答案1

根据那的来源z,它是一个别名。别名有点像 C 预处理器宏,它们不是命令或函数。它们来自没有功能的 C shell,并且并不真正属于类似 Bourne 的 shell,但人们继续使用它们主要是因为 csh 长期以来都是非常流行的 shell。

别名在读取时展开,而不是在执行时展开(如果执行别名有意义的话)。因此,在函数中,它们在读取函数体时扩展到函数体中,因此这里您需要在 shell 读取函数定义时已经定义别名,所以您需要确保您的函数定义位于您的. /path/to/z.sh或行之后,并确保两个语句都被一个接一个地读取和执行(例如,不是同一复合命令的一部分)。source /path/to/z.sh~/.bashrc

或者,由于该别名定义为:

alias ${_Z_CMD:-z}='_z 2>&1'

(请注意参数扩展周围缺少引号,这也是您犯的错误),您可以将函数编写为:

zl(){
  _z "$@" && ls
}

2>&1如果您确实希望将 stderr 合并到 stdout 中,请添加)

随着"$@"我们经过全部参数zl接收到_z,而不仅仅是第一个,更不用说经过 split+glob 后的第一个,就像您通过不$1加引号所做的那样。

相关内容