1

Я хотел бы иметь возможность установить таймер неактивности для окна терминала (OSX) - поэтому, если бы я ничего не набирал в течение n минут, это дало бы 'beep/alert/run script' - есть ли пока что -unfound-by-me-терминал команда / командная строка-фу, что это делает?

3 ответа3

2

Таймер неактивности

Выполнение отложенной команды очень просто: 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
1

Не уверен, что это именно то, что вы ищете, но GNU Screen имеет мониторинг молчания , и tmux делает нечто похожее с командой monitor-silence .

1

Я думал, что это было интересно выяснить. У меня нет 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .