无法在 zsh 中定义全局别名

无法在 zsh 中定义全局别名

我想定义一个输入单行代码的全局别名。

alias -g TLOGS3="\`find /var/log/trafficserver/ -name access.log\* -printf \"%T@ %Tc %p\n\" | sort -n | tail -n 3 | cut -d \" \" -f 9 | tr \"\n\" \" \"\`"

我想输入这个:-

`find /var/log/trafficserver/ -name access.log\* -printf "%T@ %Tc %p\n" | sort -n | tail -n 3 | cut -d " " -f 9 | tr "\n" " "`

但是,由于某种原因,当我在终端(zsh shell)中输入(TLOGS3 和空格键)时,我得到了这个:-

➜ $?=0 /home/arastogi [10:37AM] % TLOGS3find: `/var/log/trafficserver/': No such file or directory
`find /var/log/trafficserver/ -name access.log\* -printf "%T@ %Tc %p\n" | sort -n | tail -n 3 | cut -d " " -f 9 | tr "\n" " "`

有人能帮我了解发生了什么事吗?

答案1

从错误消息来看,该目录似乎/var/log/trafficserver/不存在或至少find无法访问它。

我猜想错误信息在输入后出现,Space是因为Space绑定到了一个小部件,它会自动尝试扩展别名。如果你的别名通常被其完整命令替换,那么肯定是这种情况。否则,你可以使用

bindkey " "

如果没有小部件绑定到Space此处,则应该显示

" " self-insert

也可能显示

" " magic-space

!!这是一个内部小部件,它在插入空格之前会扩展历史引用(如)。但它不会影响别名。

如果显示其他内容,则很可能是扩展别名的小部件。当然,根本问题仍然是目录不存在或无法访问。


除此之外,别名似乎很好用,虽然我不得不改成-f 9-f 8因为 find 只返回八个字段,这可能是由于不同的区域设置造成的。但我建议使用zsh的 glob 限定符以不太复杂的方式实现相同的目的:

alias -g TLOGS3='/var/log/trafficserver/**/access.log*(Om[-3, -1])'

这将展开为与名称匹配的文件列表/var/log/trafficserver或其任何子目录 ( )。此列表按修改时间降序排列 ( )( ;最新修改在前),并限制为倒数第三个元素 ( )。**access.log*Om[-3,-1]

如果没有子目录,且文件顺序可以反转,则可以缩短为

alias -g TLOGS3='/var/log/trafficserver/access.log*(om[1,3])'

o按升序排列,因此第一到第三个元素是最新的三个元素。

相关内容