使 cd 自动 ls

Rob*_*ohr 57 command-line bash cd-command

我发现我经常做以下事情:

%> cd bla/bla
%> ls
Run Code Online (Sandbox Code Playgroud)

我希望每当我cd进入目录时它会自动执行ls.

我摆弄.bashrc了一段时间,但不知道如何让它发生。

Ste*_*ski 63

你可以用一个函数来做到这一点:

$ cdls() { cd "$@" && ls; }
Run Code Online (Sandbox Code Playgroud)

&&意思是“cd到一个目录下,如果成功(例如目录存在),运行ls”。使用&&运算符比;在两个命令之间使用分号运算符更好,就像{ cd "$@"; ls; }. ls无论是否有效,第二个命令都会运行cd。如果cd失败,ls将打印您当前目录的内容,这会让用户感到困惑。作为最佳实践,使用&&而不是;

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log
Run Code Online (Sandbox Code Playgroud)

一般来说,重命名已经存在的命令是一种不好的做法,特别是对于像cd. 相反,创建一个具有不同名称的新命令。如果您cd使用一个也名为 的函数或别名进行覆盖cd,那么当您进入一个包含 100,000 个文件的目录时会发生什么?有许多实用程序使用cd,它们可能会对这种不寻常的行为感到困惑。如果您使用共享帐户(例如root当您与其他系统管理员一起工作时),替换现有命令可能非常危险,因为环境与人们期望的不同。

  • 第一:它在这里不起作用。第二:在那个页面中,他们使用变量,而不是位置参数。第三:ABS 是不良做法的常见来源。 (2认同)

fra*_*ous 47

我的 .bashrc 中有这个,它工作正常。

function cd {
    builtin cd "$@" && ls -F
    }
Run Code Online (Sandbox Code Playgroud)

在我的 .bashrc 早些时候,我有: [ -z "$PS1" ] && return,并且该行之后的所有内容仅适用于交互式会话,因此这不会影响cd脚本中的行为。

  • @Swivel `PS1` 变量可能未设置或为空,并且 shell 可能仍然是交互式的(但没有提示)。我会检查`$-` 以确保。 (3认同)
  • `[ -z "$PS1" ]` 检查 `$PS`(交互式提示变量)是否为“零长度”(-z)。如果长度为零,则表示尚未设置,因此 Bash 不能以交互模式运行。在这些条件下,此时 `&& return` 部分从源 `.bashrc` 中退出。 (2认同)
  • 检查交互性的另一种方法是在 `"$-"` 中查找 `i`:`case "$-" in *i*) ;; *) 返回 ;; 埃萨克`。 (2认同)

Sté*_*las 17

题外话,因为这个问题被标记为 /bash,但因为有些问题是作为这个没有提到 bash 的问题的副本而关闭的:

使用 zsh:

chpwd() ls
Run Code Online (Sandbox Code Playgroud)

chpwd() 函数在当前目录更改时(通过 cd、pushd、popd...)由 zsh 调用。tcsh 有一个类似的功能,可能是 zsh 的来源。


小智 6

为什么不在 .bashrc 文件中添加别名?

就像是:

alias cdls='cd "$@" && ls'
Run Code Online (Sandbox Code Playgroud)

  • 我对这个别名有一个奇怪的问题,当我像这样使用它时,cdls projec2,它将显示项目 2 文件夹中的所有文件,但实际上并不 cd 到该文件夹​​,而是保留在原始文件夹中。 (2认同)
  • 别名不像函数那样接受 `$@` 中的参数。该别名使用当前 shell 中的位置参数列表作为“cd”的参数,如果有的话(如果没有,它将“cd”到用户的主目录),并且执行“ls”命令行上别名后面的任何参数。 (2认同)