Imprimir salida de código en el medio de la pantalla

10

El siguiente código generará cualquier filepalabra por palabra en la pantalla. Por ejemplo:

Hello se mostrará durante 1 segundo y desaparecerá. Luego, la siguiente palabra en la oración aparecerá por un segundo y desaparecerá y así sucesivamente.

¿Cómo produzco lo que se muestra en el medio de la pantalla?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file
Nebelz Cheez
fuente
¿Qué es lo que estás tratando de lograr exactamente?
muru
ese comando muestra cada palabra de un archivo en la esquina superior izquierda de la pantalla. Necesito saber cómo hacer la salida en el medio de la pantalla.
Nebelz Cheez
44
Sí, pero ¿qué estás tratando de lograr? Esto suena como un problema XY ,
muru
¿Qué es el "medio de una pantalla"? El medio de una terminal? El medio de la pantalla real? ¿Qué sucede si cambia el tamaño del terminal, necesita esto para colocar dinámicamente el texto en el medio, sin importar el tamaño que tenga su terminal?
terdon
si. El medio de la terminal.
Nebelz Cheez

Respuestas:

7

Aquí tienes un script bash muy robusto:

#!/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
Helio
fuente
8

Prueba el guión a continuación. Detectará el tamaño del terminal para cada palabra de entrada, por lo que incluso se actualizará dinámicamente si cambia el tamaño del terminal mientras se está ejecutando.

#!/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 

Guárdelo como ~/bin/foo.sh, hágalo ejecutable ( chmod a+x ~/bin/foo.sh) y dele su archivo de entrada como primer argumento:

foo.sh file
terdon
fuente
3

función 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"
Ratnakar Pawar
fuente
1
Esto parece ser exactamente lo mismo que mi respuesta, excepto que muestra una cosa y no cada palabra de una oración leída de un archivo por separado según lo solicitado por el OP.
terdon
1

Aquí está el script Python que es similar a la bashsolución de @ Helio :

#!/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)
jfs
fuente