我发现我经常做以下事情:
%> cd bla/bla
%> ls
我希望每当我cd
进入目录时它都会自动执行一个ls
.
我摆弄了.bashrc
一段时间,但不知道如何实现它。
答案1
您可以使用一个函数来做到这一点:
$ cdls() { cd "$@" && ls; }
意思&&
是“cd
到一个目录,如果成功(例如目录存在),则运行ls
”。使用&&
运算符比在两个命令之间使用分号运算符更好;
,如{ cd "$@"; ls; }
。ls
无论是否有效,第二个命令都会运行cd
。如果cd
失败,ls
将打印当前目录的内容,这会让用户感到困惑。作为最佳实践,请使用&&
而不是;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
一般来说,重命名已经存在的命令是一种不好的做法,特别是对于像cd
.相反,创建一个具有不同名称的新命令。如果你cd
用一个同样名为 的函数或别名覆盖cd
,当你进入一个有 100,000 个文件的目录时会发生什么?有许多实用程序使用cd
,它们可能会对这种不寻常的行为感到困惑。如果您使用共享帐户(例如root
当您与其他系统管理员一起工作时),替换现有命令可能非常危险,因为环境与人们期望的不同。
答案2
我的 .bashrc 中有这个,它工作正常。
function cd {
builtin cd "$@" && ls -F
}
在我的 .bashrc 的早期部分,我有:[ -z "$PS1" ] && return
,该行之后的所有内容仅适用于交互式会话,因此这不会影响cd
脚本中的行为方式。
答案3
题外话,因为问题被标记为 /bash,但由于一些问题作为与此问题重复的问题而被关闭,但未提及 bash:
使用 zsh:
chpwd() ls
chpwd()
每当当前目录发生更改(通过 cd、pushd、popd...另请参阅该autocd
功能)时,zsh 都会调用该函数。 tcsh 有类似的功能,并且可能是 zsh 的来源。
在较新版本的 中zsh
,与其他挂钩函数一样,您可以执行以下操作:
my_chpwd_hook() ls
chpwd_functions+=( my_chpwd_hook )
如果您或您使用的某些第三方插件在当前工作目录更改时需要执行单独且独立的操作,则这种方法会更好。
答案4
为什么不向 .bashrc 文件添加别名?
就像是:
alias cdls='cd "$@" && ls'