总是在另一个命令之后运行一个命令

JJJ*_*jim 8 zsh command-line ls

使用zsh(和oh-my-zsh),是否可以始终在某个其他命令之后运行一个命令?我想总是对目录运行lsafter cd,而不是cd example; ls每次都运行。

我试过了:

function cd {
  cd $1
  ls
}
Run Code Online (Sandbox Code Playgroud)

但它似乎zsh在运行时退出,没有任何输出(堆栈溢出?)。更改函数的名称使其按预期工作,但我宁愿仍然使用该cd命令。

alias cd='cd $1;ls'
Run Code Online (Sandbox Code Playgroud)

列出指定的目录,但实际上并不更改工作目录。

是否有可能做到这一点,如果有,如何做到?

mpy*_*mpy 13

虽然你自己已经解决了你的问题,但我想详细说明一下。

为什么您的别名不起作用:

@evilsoup 已经暗示过了,但要明确说明:别名(在zshbash 中)不能接受参数(而在csh 中可以)。将其视为简单的字符串替换。因此,使用已alias cd='cd $1;ls'定义,命令cd foo扩展为cd ; ls foo因为$1为空(在此上下文中未定义),并且您会看到 的内容,foo/但外壳确实cd进入了当前目录(在 之后没有参数cd)。

为什么您在问题中的功能不起作用:

您定义了一个函数cd,该函数本身调用cd. 所以你最终陷入了一个无限循环。当前的 zsh 版本 (5.0.2) 没有段错误,但会出现错误:

cd:1: maximum nested function level reached
Run Code Online (Sandbox Code Playgroud)

解决方案是builtin cd在您的函数中使用cd——因为您已经自己解决了。

为什么你的功能(从那里)可以改进

您正在重新定义该cd功能。如果您明确调用它,那效果很好。但是 zsh 提供了AUTO_CD选项(用 设置setopt AUTO_CD):

如果发出的命令不能作为普通命令执行,并且该命令是目录名,则对该目录执行cd命令。

这意味着您可以/var通过简单地键入/var而不是cd /var. 在这种情况下,您的cd函数没有被调用,您也没有看到/var自动的内容。

pushd并且popd是重新定义的cd命令无济于事的其他情况。

ZSH方式

正如@evilsoup 在评论中指出的那样,SE/UL 上的 Stephane Chazelas已经给出了 zsh-ish 方式:不要重新定义cd,而是使用钩子函数chpwd(),正是因为这个原因:

chpwd 每当当前工作目录更改时执行。

所以只需添加

function chpwd() {
  ls
}
Run Code Online (Sandbox Code Playgroud)

到您的~/.zshrc. (chpwd() ls链接的答案中给出了一种简短的形式。)


JJJ*_*jim 3

Unix/Linux 上的这篇文章为我解决了这个问题:

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

这是关于 bash 的,但在 zsh 中对我有用。