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


22

几乎每次我通过命令行(为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”的行为,使其更改为请求的目录,然后再执行其他操作?

Answers:


30

以下应该工作:

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

由于该功能在一行上,因此请确保;以上述方式终止该功能,以使其正常工作。


不适用于无参数调用。
丹尼尔·贝克

3
@DanielBeck-至少在我的Mac OSX(10.6.7)上,它通过无参数调用可以正常工作。行为是它更改到主目录,然后执行该目录的列表。通过在末尾添加新功能,有效地复制了普通的“ cd”功能。
艾伦·史密斯,

2
@Alan是的,我通过临时将代码编写到shell中进行了测试。看来的行为cd ""(什么这个答案应该评估不同于cd "$@"$@抱歉的混乱。
丹尼尔·贝克

@DanielBeck-不用担心。
艾伦·史密斯,

2
注意:我将其更改为可接受的答案,因为它是对问题的精确答案。@RichHomolka编写的一个非常适合解决委托人问题,但这恰恰可以放在〜/ .bash_profile文件中。
艾伦·史密斯,

10

我认为您遇到了麻烦。您的cd函数正在调用cd,这是...函数。

您需要知道builtin哪个是使命令查找使用cd之类的Bash内置函数而不是您的函数的关键字

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不能影响父进程。

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


我建议builtin cd $@ && ls; 因为cd通话应该成功,其他所有内容才有意义。另外,请记住特殊情况,例如cd(无参数)。
丹尼尔·贝克

旁注:我试图将其标记为已接受的答案,但它告诉我必须再等待6分钟才能执行此操作。在执行此操作之前,不知道存在内置延迟。
艾伦·史密斯,

@Alan在一个非常合理的时间范围内(即您必须等待的那几分钟),可能会出现另一个更好的解决方案。我想这就是系统强制执行延迟的原因:您应该优先选择质量而不是速度。不应该带来太多不便。
丹尼尔·贝克

我们有一个赢家。这就像冠军。对于@@ DanielBeck,我更改为使用&&并将其压缩为一行:function cd {builded cd“ $ @” && ls -l; }
艾伦·史密斯,

@DanielBeck-是的,我不必担心。只是从来没有注意到它。我可以看到其中的逻辑,只是让我有些惊讶。
艾伦·史密斯

6

我建议不要覆盖CD,因为还有其他一些脚本劫持了“ CD”功能,例如rvm。最好选择另一个名称,例如'd',而不要在函数中指定'builtin'类型。否则,劫机者将无法运行。我正在使用以下代码:

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

根据OP的问题,我认为这行不通。
user305964 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.