2012-09-25 27 views
6

Có cách nào để sửa đổi lệnh sắp thực hiện không? Tôi muốn chuyển hướng đầu ra đến một tệp, cũng như in nó trên thiết bị đầu cuối. Tôi thấy rằng ls > file.txt | cat thực hiện công việc, vì vậy tôi muốn thêm rằng > file.txt | cat vào bất kỳ lệnh nào sắp thực thi.
Có cách nào tốt hơn để chuyển hướng đến tệp và in tới thiết bị đầu cuối không? Tôi đang cố gắng để làm một logger.zsh preexec sửa đổi lệnh

+1

tee là lệnh để sử dụng tại đây,> tệp | mèo khá là khó hiểu –

Trả lời

0

Có một số cách để làm điều đó, 1 Tôi thích nhất là khối này tôi tìm thấy ở đây 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 

Cũng cần chú ý rằng tôi đã thêm 'fc' '> file.txt | cat' vào danh sách abk

Điều này không trong rằng bạn nhập fc sau lệnh và sau đó bạn nhấn ,. (dấu phẩy và dấu chấm) trong kế tiếp nhanh và zsh sẽ thay thế fc cho > file.txt | cat

5

Bạn có thể thay đổi hành động được thực hiện khi bạn thực hiện một dòng để thay đổi lệnh sẽ được thực thi. Điều này có thể được thực hiện bằng cách xác định một hàm mà bạn sau đó liên kết với khóa nhập.

Cho phép đầu tiên xác định hàm có thể thêm '> file.txt | cat 'kết thúc với bất kỳ lệnh nào:

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

Phần tiếp theo là thay thế hành vi nhập mặc định bằng chức năng mới của bạn. Hành vi mặc định mà chúng ta đang thay thế là hàm accept-line, và nếu chúng ta xem xét zle documentation, bạn sẽ thấy rằng dòng chấp nhận được liên kết với^J và^M.

Để ràng buộc chức năng này để những chữ cái đầu tiên bạn cần phải biến nó thành một widget:

zle -N log_and_accept_widget log_and_accept 

Sau đó, bạn có thể gắn nó, thay thế các hành vi cũ:

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

Bây giờ bạn sẽ có mở rộng lệnh đó cho mỗi lệnh duy nhất bạn làm. Mọi cd, ls, vim, v.v. Vì vậy, tôi khuyên bạn nên xác định thêm một vài chức năng thực sự bật và tắt:

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 

Tôi nghĩ bạn nên cẩn thận với điều này. Sau khi kiểm tra nó một chút, tôi nhanh chóng không thích nó.

Các vấn đề liên quan