Shell-Script

是否可以在 shell 腳本中使用像 fg 這樣的命令?

  • July 11, 2020

我正在嘗試創建一個有趣的終端螢幕保護程序,它由cmatrix包組成(一個類似於電影The Matrix的終端)並xprintidle確定終端的空閒時間。

我從SuperUser的這個 Thread 答案中獲得了一些幫助,並使用了類似於它的 shell 腳本,如下所示:

screensaver.sh

#!/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中,以便它實際上成為可定制的功能。這可能嗎?

fg作業命令僅連接到互動式會話,在批處理模式(腳本)中沒有任何意義。

從技術上講,您可以使用 啟用它們set -m,但它仍然沒有什麼意義(如果有的話),因為這僅與互動式應用程序有關,您可以通過 ^Z 將作業發送回,但由於您在 shell 中沒有這種互動腳本,它使它毫無意義。

答案是:實際上,不,你不能。

如果您使用 tmux,它有一個“螢幕保護程序”選項

set -g lock-command "cmatrix -abs"
set -g lock-after-time 10 #inSeconds

不完全是您問題的答案。

引用自:https://unix.stackexchange.com/questions/354673