我正在尝试创建一个有趣的终端屏幕保护程序,其中包含cmatrix
程序包(将终端变成类似于电影的程序包)矩阵)并xprintidle
确定终端的空闲时间。
我从中得到了一些帮助超级用户的主题答案并使用与其类似的 shell 脚本,如下所示:
屏幕保护程序
#!/bin/sh
set -x # Used for debugging
IDLE_TIME=$((60*1000)) #a minute in milliseconds
screen_saver(){
# My screensaver function
cmatrix -abs
}
sleep_time=$IDLE_TIME
triggered=false
while sleep $(((sleep_time+999)/1000)); do
idle=$(xprintidle)
if [ $idle -ge $IDLE_TIME ]; then
if ! $triggered; then
screen_saver
triggered=true
sleep_time=$IDLE_TIME
fi
else
triggered=false
sleep_time=$((IDLE_TIME -idle+100))
fi
done
当我使用以下命令在前台运行脚本时,该脚本运行完美:
./screensaver.sh
我可以看到矩阵终端被触发。
但是,如果我在后台运行它&
;该功能screen_saver()
在后台触发,我无法查看。查看矩阵终端的唯一可能方法是使用fg
将其置于前景的方式。
问题
是否可以fg
在函数中使用screen_saver()
以下命令:
screen_saver(){
cmatrix -abs && fg
}
或者类似的选项将其带到 shell 脚本中的前台?
我希望将此脚本添加到我的脚本中,.bashrc
以便它实际上成为一个可定制的功能。这可能吗?
答案1
作业fg
命令仅连接到交互式会话,在批处理模式(脚本)中没有任何意义。
从技术上讲,您可以使用 启用它们set -m
,但它仍然没有什么意义(如果有的话),因为这仅与您可以通过 ^Z 将作业发送回的交互式应用程序相关,但因为您在 shell 中没有这种交互脚本,这使得它毫无意义。
答案是:实际上,不,你不能。
答案2
如果您使用 tmux,它有一个“屏幕保护程序”选项
set -g lock-command "cmatrix -abs"
set -g lock-after-time 10 #inSeconds
不完全是你问题的答案。