几乎每次我通过命令行(即 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;}