2012-09-25 13 views
6

Czy istnieje sposób modyfikacji polecenia, które ma zostać wykonane? Chciałbym przekierować wyjście do pliku, a także wydrukować go na terminalu. Znalazłem, że zadanie wykonuje ls > file.txt | cat, więc chciałbym dodać, że > file.txt | cat do każdego polecenia, które ma zamiar wykonać.
Czy istnieje lepszy sposób przekierowania do pliku i drukowania na terminalu? Próbuję zrobić logger.modyfikacja polecenia zsh preexec

+1

tee jest poleceniem do użycia tutaj,> plik | kot jest dość zagmatwany –

Odpowiedz

0

Istnieje kilka sposobów na tym, 1 lubię najbardziej jest to blok znalazłem tutaj 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 

zauważyć także, że dodałem 'fc' '> file.txt | cat' do listy abk

Co to robi w że po poleceniu wpisujesz fc, a następnie trafiasz na ,. (przecinek i kropka) w krótkim odstępie czasu i zsh zastąpi fc dla > file.txt | cat

5

Można zmienić czynność, która jest wykonywana podczas wykonywania linii, aby zmienić polecenie, które zostanie wykonane. Można to zrobić, definiując funkcję, którą następnie powiążesz z klawiszem Enter.

Najpierw określmy funkcję, która może dodać "> plik.txt | cat "kończący się dowolną komendą:

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

Następna część polega na zastąpieniu domyślnego zachowania klawisza Enter za pomocą nowej funkcji. Domyślnym zachowaniem, które zastępujemy, jest funkcja akceptująca linię, a jeśli spojrzymy na zle documentation, zobaczysz, że linia akceptacji jest powiązana z^J i^M.

Aby powiązać tę funkcję do tych listów trzeba najpierw przekształcić go w widget:

zle -N log_and_accept_widget log_and_accept 

Następnie można wiązać, zastępując starą zachowanie:

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

Teraz będziesz rozwijanie tego polecenia dla każdego wykonywanego polecenia. Każdy cd, ls, vim itp itd. W związku z tym polecam, aby zdefiniować kilka dodatkowych funkcji, które faktycznie wyłączyć tę włączania i wyłączania:

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 

myślę, że należy być ostrożnym z tym. Po przetestowaniu go trochę, szybko zacząłem go nie lubić.