zsh preexec命令修改

10

有没有一种方法可以修改即将执行的命令? 我想将输出重定向到文件,并在终端上打印出来。 我发现ls > file.txt | cat可以完成任务,因此我想将> file.txt | cat添加到任何即将执行的命令中。
有更好的方法将输出重定向到文件并打印到终端吗?我正在尝试创建一个日志记录器。


2
tee 是在此处使用的命令,> 文件 | cat 相当令人困惑。 - Good Person
2个回答

10
你可以更改执行行时执行的操作以更改将要执行的命令。这可以通过定义一个函数并将其绑定到回车键来完成。首先,让我们定义一个函数,它可以向任何命令添加"> file.txt | cat" 结尾。
function log_and_accept {
    BUFFER="$BUFFER > file.txt | cat"
    zle accept-line
}

下一步是实际替换默认的回车键行为为您的新功能。我们要替换的默认行为是accept-line函数,如果查看zle文档,您将看到accept-line绑定到^J和^M。
要将此函数绑定到这些字母,您首先需要将其转换为小部件:
zle -N log_and_accept_widget log_and_accept

然后你可以绑定它,替换旧的行为:

bindkey '^J' log_and_accept_widget
bindkey '^M' log_and_accept_widget

现在,您将为每个命令扩展该命令。每个cd,ls,vim等等。因此,我建议您定义几个更多的函数来实际开启和关闭它:

function turn_on_logging {
    bindkey '^J' log_and_accept_widget
    bindkey '^M' log_and_accept_widget
}
function turn_off_logging {
    bindkey '^J' accept-line
    bindkey '^M' accept-line
}

zle -N turn_on_logging_widget turn_on_logging
zle -N turn_off_logging_widget turn_off_logging

bindkey '^P' turn_on_logging_widget
bindkey '^O' turn_off_logging_widget

我认为你应该小心处理这个。经过一番测试,我很快就开始不喜欢它了。


1

有几种方法可以做到这一点,我最喜欢的是在这里找到的这个代码块 http://git.grml.org/?p=grml-etc-core.git;a=blob_plain;f=etc/zsh/zshrc;hb=HEAD

abk=(
  '...'  '../..'
  '....' '../../..'
  'BG'   '& exit'
  'C'    '| wc -l'
  'G'    '|& grep '${grep_options:+"${grep_options[*]}"}
  'H'    '| head'
  'Hl'   ' --help |& less -r'    #d (Display help in pager)
  'L'    '| less'
  'LL'   '|& less -r'
  'M'    '| most'
  'N'    '&>/dev/null'           #d (No Output)
  'R'    '| tr A-z N-za-m'       #d (ROT13)
  'SL'   '| sort | less'
  'S'    '| sort -u'
  'T'    '| tail'
  'V'    '|& vim -'
  'co'   './configure && make && sudo make install'
  'fc'   '> file.txt | cat'
)

zleiab() {
  emulate -L zsh
  setopt extendedglob
  local MATCH

  if (( NOABBREVIATION > 0 )) ; then
      LBUFFER="${LBUFFER},."
      return 0
  fi

  matched_chars='[.-|_a-zA-Z0-9]#'
  LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
  LBUFFER+=${abk[$MATCH]:-$MATCH}
}

zle -N zleiab && bindkey ",." zleiab

还要注意我将'fc' '> file.txt | cat'添加到列表abk

这样做的效果是,您在命令后键入fc,然后快速按下,.(逗号和句号),zsh将用> file.txt | cat替换fc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接