![为什么我不能在 bash 函数中使用“z”命令?](https://linux22.com/image/218312/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%B8%8D%E8%83%BD%E5%9C%A8%20bash%20%E5%87%BD%E6%95%B0%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9Cz%E2%80%9D%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想要完成的是:跳转到一个目录并列出其内容。
我在 .bash_aliases 中添加的 bash 函数是:
function zl(){
z $1 && ls
}
但是,当调用此函数时,我收到以下错误:
❯ zl node
z: command not found
但当我单独使用 z 命令时,它可以完美地工作。
为什么我不能在函数内使用 z 命令?
我尝试过的修复:
- 将源 /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
加引号所做的那样。