是否可以在 shell 脚本中使用像“fg”这样的命令?

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 中没有这种交互脚本,这使得它毫无意义。

答案是:实际上,不,你不能。