我是Linux的新手,只是在学习使计算机完成我想要的工作。
所以我的愿望是,每当我使用cd
命令,我希望它更改目录,然后列出其中存在的所有文件。如果没有传递任何参数,我希望运行pwd
命令。
这是我到目前为止所做的。
function cd {
if [ $# -eq 0 ]
then
pwd
else
cd "$1"; ls -l
fi
}
当我运行此命令时,如果没有传递任何参数并且运行pwd命令,则可以正常工作。但是,当我传递参数时,它不显示任何内容并关闭终端,这不是我想要的。
当我将函数名称更改为ca并运行ca
时,它按预期工作。
为什么会这样?是否有不允许使用的别名列表?我该如何运作?
答案 0 :(得分:1)
如果存在,chpwd_functions
是一个函数名数组,每当工作目录更改时,就会依次调用每个函数名。就您而言,它可以按如下方式使用:
foo () {
if [[ $PWD == $HOME ]]; then
pwd
else
ls -l
fi
}
chpwd_functions+=(foo)
答案 1 :(得分:0)
您递归地调用函数,而不是调用内置的cd
。
在ZSH中,builtin
命令可用于执行内置的显式禁止shell函数查找。这正是实现与内置Shell名称相同的函数所需要的
function cd {
if [ $# -eq 0 ]
then
pwd
else
builtin cd "$1" ; ls -l
fi
}
这也适用于BASH。
command
在BASH中,您可以使用内置command
来执行外部命令或内置命令。这就是BASH与ZSH不同的地方,因为ZSH command
仅执行外部命令。
仅在BASH中
command cd
与builtin cd
的工作原理相同(假设/bin/cd
不存在)
在ZSH中
除非存在command cd
,否则 cd: command not found
可能会因/bin/cd
而失败
答案 2 :(得分:0)
Bash中的“ cd”命令可以使用选项,因此仅使用$ 1会删除目录名称。这一切都通过了:
function cd {
if [ $# -eq 0 ]
then
pwd
else
cd "$@"; ls -l
fi
}
答案 3 :(得分:0)
从bash切换到zsh时,我遇到了类似的问题。示例功能...
go() {
if [[ $@ == "code" ]]; then command cd "$CODE";
}
对我来说,解决方案是1.用function
前缀我的函数,并用command
替换builtin
function go() {
if [[ $@ == "code" ]]; then builtin cd "$CODE";
}