2012-09-25 9 views
6

¿Hay alguna forma de modificar el comando que está a punto de ejecutarse? Me gustaría redirigir el resultado a un archivo, así como también imprimirlo en el terminal. Encontré que ls > file.txt | cat hace el trabajo, por lo que me gustaría agregar ese > file.txt | cat a cualquier comando que esté a punto de ejecutarse.
¿Hay una mejor manera de redirigir a archivo e imprimir a la terminal? Estoy tratando de hacer un registrador.modificación del comando zsh preexec

+1

tee es el comando a usar aquí,> archivo | el gato es bastante confuso –

Respuesta

0

Hay varias maneras de hacerlo, el 1 que más me gusta es este bloque que encontré aquí 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 

Observe también que añadí 'fc' '> file.txt | cat' a la lista abk

Lo que esto hace en que escriba fc después del comando y luego presione ,. (coma y el punto) en una sucesión rápida y zsh reemplazarán fc para > file.txt | cat

5

Puede cambiar la acción que se realiza cuando se ejecuta una línea de alterar el comando que se ejecutará. Esto se puede hacer definiendo una función que luego se vincula a la tecla Intro.

Primero definamos una función que puede agregar el '> archivo.txt | cat 'terminando con cualquier comando:

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

La siguiente parte es reemplazar realmente el comportamiento predeterminado de la tecla enter con su nueva función. El comportamiento predeterminado que estamos reemplazando es la función accept-line, y si miramos el zle documentation, verá que accept-line está obligado a^J y^M.

Para aprisionar esta función a esas cartas primero tiene que convertirlo en un widget:

zle -N log_and_accept_widget log_and_accept 

A continuación, puede obligar a éste, en sustitución del antiguo comportamiento:

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

Ahora habrá ampliando ese comando para cada comando que haces. Cada cd, ls, vim, etc, etc Por lo tanto recomiendo que se define un par de funciones que hacen de esta realidad dentro y fuera:

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 

Creo que hay que tener cuidado con esto. Después de probarlo un poco, rápidamente me disgustó.