Drucken Sie die Code-Ausgabe in der Mitte des Bildschirms aus

10

Der folgende Code gibt fileWort für Wort alles auf dem Bildschirm aus. Beispielsweise:

Hello wird 1 Sekunde lang angezeigt und verschwindet. Dann erscheint das nächste Wort im Satz für eine Sekunde und verschwindet und so weiter.

Wie gebe ich alles aus, was in der Mitte des Bildschirms angezeigt wird?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file
Nebelz Cheez
quelle
Was genau wollen Sie erreichen?
Muru
Dieser Befehl zeigt jedes Wort aus einer Datei in der oberen linken Ecke des Bildschirms an. Ich muss wissen, wie man die Ausgabe in der Mitte des Bildschirms macht.
Nebelz Cheez
4
Ja, aber was versuchst du zu erreichen? Dies klingt wie ein XY-Problem ,
Muru
Was ist die "Mitte eines Bildschirms"? Mitten in einem Terminal? Die Mitte des eigentlichen Bildschirms? Was ist, wenn Sie die Größe des Terminals ändern? Benötigen Sie dies, um den Text dynamisch in der Mitte zu platzieren, unabhängig von der Größe Ihres Terminals?
Terdon
Ja. Die Mitte des Terminals.
Nebelz Cheez

Antworten:

7

Hier sind Sie ein sehr robustes Bash-Skript:

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

Versuchen Sie das folgende Skript. Es erkennt die Größe des Terminals für jedes Eingabewort und wird sogar dynamisch aktualisiert, wenn Sie die Größe des Terminals während der Ausführung ändern.

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

Speichern Sie es als ~/bin/foo.sh, machen Sie es ausführbar ( chmod a+x ~/bin/foo.sh) und geben Sie Ihre Eingabedatei als erstes Argument an:

foo.sh file
Terdon
quelle
3

Bash-Funktion, um dasselbe zu tun

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

und dann

mpt "Text to show"
Ratnakar Pawar
quelle
1
Dies scheint genau das gleiche zu sein wie meine Antwort, außer dass es eine Sache zeigt und nicht jedes Wort eines Satzes, das separat aus einer Datei gelesen wird, wie vom OP angefordert.
Terdon
1

Hier ist ein Python-Skript, das der bashLösung von @ Helio ähnelt :

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