É possível usar comandos como 'fg' em um script de shell?

3

Estou tentando criar um Screensaver de terminal divertido que consiste no pacote cmatrix (um que transforma o terminal em um similar ao filme Matrix ) e xprintidle para determinar o tempo ocioso de o Terminal.

Eu peguei uma ajuda desse Thread responder no SuperUser e usar um script de shell semelhante a este da seguinte forma:

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

O script é executado sem falhas quando eu o executo em primeiro plano usando:

./screensaver.sh

e eu posso ver o terminal de matriz acionado.

No entanto, se eu executar em segundo plano com & ; a função screen_saver() é acionada em segundo plano e não consigo visualizá-la. A única maneira possível de ver o terminal da matriz é usar fg , o que o coloca em primeiro plano.

Pergunta

É possível usar o comando fg na função screen_saver() like:

screen_saver(){
     cmatrix -abs && fg
}

ou opção similar para trazê-lo para o primeiro plano dentro do script de shell?

Eu gostaria de adicionar esse script ao meu .bashrc para que ele se torne um recurso personalizável. Isso é possível?

    
por Shan-Desai 29.03.2017 / 23:08

2 respostas

1

Os comandos fg, job, estão conectados apenas a sessões interativas e não têm significado no modo batch (scripts).

Tecnicamente, você poderia habilitá-los com o sinalizador -m, mas ainda faria pouco (se algum) sentido, pois isso se relaciona apenas a aplicativos interativos, nos quais você pode enviar trabalhos por ^ Z, mas desde que você não não tem essa interação em um shell script, isso torna inútil.

A resposta está na prática, não, você não pode.

    
por 30.03.2017 / 00:42
1

Se você usa o tmux, tem uma opção para "screensaver"

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

Não é exatamente uma resposta para sua pergunta.

    
por 30.03.2017 / 14:21