Imprimer la sortie du code au milieu de l'écran

10

Le code ci-dessous affichera quoi que ce soit filemot par mot à l'écran. Par exemple:

Hello s'affiche pendant 1 seconde et disparaît. Ensuite, le mot suivant de la phrase apparaît pendant une seconde et disparaît et ainsi de suite.

Comment puis-je sortir tout ce qui est affiché au milieu de l'écran?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file
Nebelz Cheez
la source
Qu'est-ce que vous essayez de réaliser exactement?
muru
cette commande affiche chaque mot d'un fichier dans le coin supérieur gauche de l'écran. J'ai besoin de savoir comment faire la sortie au milieu de l'écran.
Nebelz Cheez
4
Oui, mais qu'essayez-vous de réaliser? Cela ressemble à un problème XY ,
muru
Quel est le "milieu d'un écran"? Au milieu d'un terminal? Au milieu de l'écran réel? Et si vous redimensionnez le terminal, en avez-vous besoin pour placer dynamiquement le texte au milieu, quelle que soit la taille de votre terminal?
terdon
Oui. Le milieu du terminal.
Nebelz Cheez

Réponses:

7

Voici un script bash très robuste:

#!/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
Hélio
la source
8

Essayez le script ci-dessous. Il détectera la taille du terminal pour chaque mot d'entrée et sera même mis à jour dynamiquement si vous redimensionnez le terminal pendant son fonctionnement.

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

Enregistrez-le sous ~/bin/foo.sh, rendez-le exécutable ( chmod a+x ~/bin/foo.sh) et donnez-lui votre fichier d'entrée comme premier argument:

foo.sh file
terdon
la source
3

fonction bash pour faire de même

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

puis

mpt "Text to show"
Ratnakar Pawar
la source
1
Cela semble être exactement la même que ma réponse, sauf qu'elle montre une chose et non chaque mot d'une phrase lu séparément dans un fichier, comme demandé par le PO.
terdon
1

Voici un script Python similaire à la bashsolution 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
la source