是否可以覆盖命令行内置的“cd”命令?

是否可以覆盖命令行内置的“cd”命令?

几乎每次我通过命令行(即 bash)“cd”到我机器(在本例中,运行的是 Mac OS X 10.6.7)上的不同目录时,我都会立即输入“ls”以获取该目录中的内容列表。我正在尝试找出一种方法来覆盖“cd”,以便它更改到请求的目录,然后一次性提供列表。

通过将以下行添加到我的 ~/.bash_profile 中,我已经能够获得我正在寻找的基本功能

function cl() { cd "$@"; ls -l; }

这按预期工作。更改到请求的目录,然后显示内容。我遇到的问题是尝试覆盖“cd”本身,而不是创建新的“cl”命令。

以下事情不要工作

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

我还尝试了其他几个未列出的迭代,并创建了一个指向有效“cl”函数的别名。但都不起作用。

我在文档中读到的内容谈到了“cd”不能作为外部命令运行(据我理解,这是函数需要使用它的方式)。

因此,我目前可以使用我的“cl”命令并获得我想要的东西,但问题是/仍然是:

有没有办法覆盖“cd”的行为,让它改变到请求的目录,然后再做其他的事情?

答案1

以下应该有效:

function cd() { builtin cd "$@" && ls -l; }

由于该函数位于一行上,请确保它以;如上所述的方式终止才能正常工作。

答案2

我认为您陷入了循环。您的cd函数正在调用cd,也就是... 函数。

您需要知道builtin哪个是关键字,它使命令查找使用 Bash 内置命令(如 cd)而不是您的函数

function cd
{
    builtin cd "$1"
    : do something else
}

而且,/usr/bin/cd即使存在这样的命令,呼叫也永远不会起作用。

会发生什么:

  • 我的 Bash shell 在 dir 中/bash/dir
  • 我运行一个命令/usr/bin/cd /dir/for/cd
  • /usr/bin/cd转到目录/dir/for/cd
  • /usr/bin/cd退出。
  • Bash 仍处于 状态/bash/dir,因为子进程/usr/bin/cd无法影响父进程。

别名也是简单的文本替换。它们永远不能有参数。

答案3

我建议不要覆盖 cd,因为有些其他脚本会劫持“cd”函数,例如 rvm。最好选择其他名称,例如“d”,并且不要在函数中指定“builtin”类型;否则,劫持者将无法运行。我使用以下代码:

function d() { cd "$@" && ls;} 

相关内容