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
Odpowiedz
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
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ć.
tee jest poleceniem do użycia tutaj,> plik | kot jest dość zagmatwany –