我希望能够为终端窗口(OSX)设置一个不活动计时器 - 所以如果我在 n 分钟内没有输入任何内容,它就会发出“哔声/警报/运行脚本” - 是否有一个我尚未找到的终端命令/命令行可以做到这一点?
答案1
不活动计时器
运行延迟命令很简单: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更简单:
autoload -Uz add-zsh-hook
add-zsh-hook precmd inactivity-start-timer
add-zsh-hook preexec inactivity-stop-timer
答案2
答案3
我觉得这是一个有趣的问题。我没有 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