Я хотел бы иметь возможность установить таймер неактивности для окна терминала (OSX) - поэтому, если бы я ничего не набирал в течение n минут, это дало бы 'beep/alert/run script' - есть ли пока что -unfound-by-me-терминал команда / командная строка-фу, что это делает?
3 ответа
Таймер неактивности
Выполнение отложенной команды очень просто: sleep <sleep time>; run_a_command
Оборачиваем это в функции запуска / остановки таймера:
INACTIVITY_TIME='5m'
INACTIVITY_CMD='echo -ne \a'
function inactivity-start-timer () {
(sleep "$INACTIVITY_TIME"; $INACTIVITY_CMD) &
INACTIVITY_PID=$!
disown
}
function inactivity-stop-timer () {
kill $INACTIVITY_PID > /dev/null 2>&1
}
Вы можете добавить что ваш shell rc файл. Теперь вам нужно запускать inactivity-start-timer
перед каждым запросом и inactivity-stop-timer
перед каждым выполнением команды. (Вы не хотите звуковой сигнал, если команда занимает слишком много времени, не так ли?) Также предполагается, что у вас включен системный звонок, в противном случае введите другую команду в INACTIVITY_CMD
.
удар
Я предполагаю, что вы используете Bash? В этом случае PROMPT_COMMAND запускает команду перед каждым приглашением. Но ничего встроенного для запуска перед каждым выполнением команды. Есть известная хитрость, чтобы получить это здесь. Так что добавьте это также в ваш .bashrc:
PROMPT_COMMAND=inactivity-start-timer
preexec () {
inactivity-stop-timer
}
preexec_invoke_exec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
Zsh
Если вы используете zsh с другой стороны, это проще:
autoload -Uz add-zsh-hook
add-zsh-hook precmd inactivity-start-timer
add-zsh-hook preexec inactivity-stop-timer
Не уверен, что это именно то, что вы ищете, но GNU Screen имеет мониторинг молчания , и tmux делает нечто похожее с командой monitor-silence .
Я думал, что это было интересно выяснить. У меня нет BSD, поэтому я решил проблему в Linux. Для BSD есть что-то вроде inotify, называемое kqueue(2), но я не знаю, есть ли удобные инструменты мониторинга, такие как inotifywait
для этого ядра.
Идея состоит в том, чтобы контролировать стандартный вывод терминала, который является файлом.
#!/bin/bash
myterm=/dev/`ps -o tty= | head -n1`
if [ $# -eq 0 ] && [ -r $myterm ] && [ ! -d $myterm ]; then
terminal=$myterm
else
terminal=${1:-/dev/pts/1}
fi
function time_out {
echo timeout
loop=false
}
loop=true
timeout=4
while $loop; do
inotifywait $terminal -qq -t $timeout -e MODIFY || time_out
done