10 votos

Impresión de código en medio de la pantalla

El código siguiente en la salida file palabra por palabra en la pantalla. Por ejemplo:

Hellose muestra durante 1 segundo y desaparece. Entonces, la siguiente palabra en la frase aparecerá durante un segundo y desaparece y así sucesivamente.

¿Cómo hacer salida de lo que se muestra en el centro de la pantalla?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file

8voto

Stewart Puntos 1385

Prueba la siguiente secuencia de comandos. Detecta que el tamaño de la terminal por cada palabra entrada tan incluso dinámicamente actualizará si usted cambia el tamaño del terminal mientras esté en funcionamiento.

#!/usr/bin/env bash

## Change the input file to have one word per line
tr ' ' '\n' < "$1" | 
## Read each word
while read word
do
    ## Get the terminal's dimensions
    height=$(tput lines)
    width=$(tput cols)
    ## Clear the terminal
    clear

    ## Set the cursor to the middle of the terminal
    tput cup "$((height/2))" "$((width/2))"

    ## Print the word. I add a newline just to avoid the blinking cursor
    printf "%s\n" "$word"
    sleep 1
done 

Guardar como ~/bin/foo.sh , hacerlo ejecutable ( chmod a+x ~/bin/foo.sh ) y su archivo de entrada como su primer argumento:

foo.sh file

7voto

Helio Puntos 2201

Aquí tienes un script de bash muy robusto para hacerlo:

#!/bin/bash

## When the program is interrupted, call the cleanup function
trap "cleanup; exit" SIGHUP SIGINT SIGTERM

## Check if file exists
[ -f "$1" ] || { echo "File not found!"; exit; }

function cleanup() {
    ## Restores the screen content
    tput rmcup

    ## Makes the cursor visible again
    tput cvvis
}

## Saves the screen contents
tput smcup

## Loop over all words
while read line
do
    ## Gets terminal width and height
    height=$(tput lines)
    width=$(tput cols)

    ## Gets the length of the current word
    line_length=${#line}

    ## Clears the screen
    clear

    ## Puts the cursor on the middle of the terminal (a bit more to the left, to center the word)
    tput cup "$((height/2))" "$((($width-$line_length)/2))"

    ## Hides the cursor
    tput civis

    ## Prints the word
    printf "$line"

    ## Sleeps one second
    sleep 1

## Passes the words separated by a newline to the loop
done < <(tr ' ' '\n' < "$1")

## When the program ends, call the cleanup function
cleanup

3voto

pdeva Puntos 4597

función de Bash para hacer lo mismo

mpt() { 
   clear ; 
   w=$(( `tput cols ` / 2 ));  
   h=$(( `tput lines` / 2 )); 
   tput cup $h;
   printf "%${w}s \n"  "$1"; tput cup $h;
   sleep 1;
   clear;  
}

y entonces

mpt "Text to show"

1voto

Barry Kelly Puntos 30330

Aquí está el script en Python que es similar a de @Helio bash solución:

#!/usr/bin/env python
import fileinput
import signal
import sys
import time
from blessings import Terminal # $ pip install blessings

def signal_handler(*args):
    raise SystemExit

for signal_name in "SIGHUP SIGINT SIGTERM".split():
    signal.signal(getattr(signal, signal_name), signal_handler)

term = Terminal()
with term.hidden_cursor(), term.fullscreen():
    for line in fileinput.input(): # read from files on the command-line and/or stdin
        for word in line.split(): # whitespace-separated words
            # use up to date width/height (SIGWINCH support)
            with term.location((term.width - len(word)) // 2, term.height // 2):
                print(term.bold_white_on_black(word))
                time.sleep(1)
                print(term.clear)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: