2012-09-25 114 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 

我想你應該小心與此有關。經過一些測試,我很快就厭惡了它。