我想定义一个输入单行代码的全局别名。
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*
O
m
[-3,-1]
如果没有子目录,且文件顺序可以反转,则可以缩短为
alias -g TLOGS3='/var/log/trafficserver/access.log*(om[1,3])'
o
按升序排列,因此第一到第三个元素是最新的三个元素。