Sha*_*sai 6 shell job-control shell-script jobs
我正在尝试创建一个有趣的终端屏幕保护程序,其中包含cmatrix
程序包(将终端变成类似于电影《黑客帝国》的程序包)并xprintidle
确定终端的空闲时间。
我从SuperUser 的这个线程答案中获得了一些帮助,并使用了类似于它的 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
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令在前台运行脚本时,该脚本运行完美:
./screensaver.sh
Run Code Online (Sandbox Code Playgroud)
我可以看到矩阵终端被触发。
但是,如果我在后台运行它&
;该功能screen_saver()
在后台触发,我无法查看。查看矩阵终端的唯一可能方法是使用fg
将其置于前景的方式。
fg
是否可以在函数中使用screen_saver()
以下命令:
screen_saver(){
cmatrix -abs && fg
}
Run Code Online (Sandbox Code Playgroud)
或者类似的选项将其带到 shell 脚本中的前台?
我希望将此脚本添加到我的脚本中.bashrc
,以便它实际上成为一个可定制的功能。这可能吗?
小智 3
作业fg
命令仅连接到交互式会话,在批处理模式(脚本)中没有任何意义。
从技术上讲,您可以使用 启用它们set -m
,但它仍然没有什么意义(如果有的话),因为这仅与您可以通过 ^Z 将作业发送回的交互式应用程序相关,但因为您在 shell 中没有这种交互脚本,这使得它毫无意义。
答案是:实际上,不,你不能。