运行cd命令时如何运行功能

时间:2019-06-02 11:15:24

标签: shell zsh

我是Linux的新手,只是在学习使计算机完成我想要的工作。

所以我的愿望是,每当我使用cd 命令,我希望它更改目录,然后列出其中存在的所有文件。如果没有传递任何参数,我希望运行pwd命令。

这是我到目前为止所做的。

function cd {
        if [ $# -eq 0 ]
        then
                pwd
        else
                cd "$1"; ls -l
        fi
}

当我运行此命令时,如果没有传递任何参数并且运行pwd命令,则可以正常工作。但是,当我传递参数时,它不显示任何内容并关闭终端,这不是我想要的。

当我将函数名称更改为ca并运行ca时,它按预期工作。

为什么会这样?是否有不允许使用的别名列表?我该如何运作?

4 个答案:

答案 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 cdbuiltin 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"; 
}