2012-09-25 78 views
6

有没有办法修改即将执行的命令? 我想将输出重定向到一个文件,并在终端上打印。 我发现ls > file.txt | cat完成了这项工作,因此我想将> file.txt | cat添加到即将执行的任何命令中。
有没有更好的方式重定向到文件并打印到终端?我正在尝试制作记录器。zsh preexec命令修改

+1

tee是此处使用的命令,> file |猫很混乱 –

回答

0

有几种方法可以做到这一点,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将替换为fc for > file.txt | cat

5

您可以更改执行某行以更改将执行的命令时执行的操作。这可以通过定义一个函数来完成,然后你可以将它绑定到回车键。

让我们先定义一个函数,它可以添加'> file.txt |猫'结束任何命令:

function log_and_accept { 
    BUFFER="$BUFFER > file.txt | cat" 
    zle accept-line 
} 

下一部分是实际上用你的新函数替换默认的回车键行为。我们正在替换的默认行为是accept-line函数,如果我们看一下zle documentation,您会看到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 

我想你应该小心与此有关。经过一些测试,我很快就厌恶了它。