2012-09-25 10 views
6

क्या निष्पादित करने वाले आदेश को संशोधित करने का कोई तरीका है? मैं आउटपुट को एक फ़ाइल में रीडायरेक्ट करना चाहता हूं, साथ ही इसे टर्मिनल पर प्रिंट करना चाहता हूं। मैंने पाया कि ls > file.txt | cat नौकरी करता है, इसलिए मैं निष्पादित करने वाले किसी भी आदेश में > file.txt | cat जोड़ना चाहता हूं।
क्या फ़ाइल पर रीडायरेक्ट करने और टर्मिनल पर प्रिंट करने का कोई बेहतर तरीका है? मैं एक लॉगर बनाने की कोशिश कर रहा हूँ।zsh preexec कमांड संशोधन

+1

टीई यहां उपयोग करने का आदेश है,> फ़ाइल | बिल्ली काफी उलझन में है –

उत्तर

0

वहाँ ऐसा करने के कई तरीके, है इस ब्लॉक मैं यहां पाया 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' जोड़ा हैं 1 मुझे सबसे ज्यादा पसंद abk

क्या इस में करता है कि आप आदेश के बाद fc टाइप करें और फिर आप पर क्लिक करें। (अल्पविराम और अवधि) तेजी से उत्तराधिकार और zsh में के लिए > file.txt | cat

5

fc का स्थान ले लेगा आप कार्रवाई है कि जब आप आदेश निष्पादित किया जाएगा बदलने के लिए एक लाइन पर अमल किया जाता है बदल सकते हैं। यह एक फ़ंक्शन को परिभाषित करके किया जा सकता है जिसे आप फिर एंटर कुंजी से जोड़ते हैं।

पहले एक फ़ंक्शन को परिभाषित करने दें जो '> file.txt | बिल्ली 'किसी भी आदेश को समाप्त होने वाले:

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

अगले भाग वास्तव में डिफ़ॉल्ट अपना नया समारोह के साथ कुंजी व्यवहार में प्रवेश को बदलने के लिए है। डिफ़ॉल्ट व्यवहार जिसे हम प्रतिस्थापित कर रहे हैं वह स्वीकृति-रेखा फ़ंक्शन है, और यदि हम zle documentation देखते हैं, तो आप देखेंगे कि स्वीकृति-रेखा^जे और^एम से जुड़ी है।

उन पत्रों आप पहली बार यह एक विजेट में बदल जाने की जरूरत को यह समारोह के लिए बाध्य करने के लिए:

zle -N log_and_accept_widget log_and_accept 

तो फिर तुम यह बाध्य कर सकते हैं, पुराने व्यवहार की जगह:

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

अब आप हो जाएगा आपके द्वारा किए गए प्रत्येक आदेश के लिए उस आदेश का विस्तार करना। हर सीडी, एलएस, 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 

मुझे लगता है कि आप इस के साथ सावधान रहना चाहिए। इसे थोड़ा परीक्षण करने के बाद, मैं जल्दी से इसे नापसंद कर दिया।