Wydrukuj kod na środku ekranu

10

Poniższy kod wyświetli filena ekranie cokolwiek słowo po słowie. Na przykład:

Hello będzie wyświetlany przez 1 sekundę i zniknie. Następnie następne słowo w zdaniu pojawi się na sekundę i zniknie i tak dalej.

Jak wyprowadzić cokolwiek, co jest wyświetlane na środku ekranu?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file
Nebelz Cheez
źródło
Co dokładnie próbujesz osiągnąć?
muru
to polecenie wyświetla każde słowo z pliku w lewym górnym rogu ekranu. Muszę wiedzieć, jak zrobić wyjście na środku ekranu.
Nebelz Cheez
4
Tak, ale co próbujesz osiągnąć? To brzmi jak problem XY ,
muru
Co to jest „środek ekranu”? Środek terminala? Środek rzeczywistego ekranu? Co się stanie, jeśli zmienisz rozmiar terminala, czy potrzebujesz tego, aby dynamicznie umieszczać tekst na środku, niezależnie od rozmiaru terminalu?
terdon
tak. Środek terminala.
Nebelz Cheez

Odpowiedzi:

7

Oto bardzo solidny skrypt bash:

#!/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
źródło
8

Wypróbuj poniższy skrypt. Wykryje rozmiar terminala dla każdego słowa wejściowego, więc nawet dynamicznie aktualizuje się, jeśli zmienisz rozmiar terminala podczas jego działania.

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

Zapisz go jako ~/bin/foo.sh, ustaw jako wykonywalny ( chmod a+x ~/bin/foo.sh) i podaj mu swój plik wejściowy jako pierwszy argument:

foo.sh file
terdon
źródło
3

funkcja bash, aby zrobić to samo

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

i wtedy

mpt "Text to show"
Ratnakar Pawar
źródło
1
Wydaje się, że jest dokładnie taka sama jak moja odpowiedź, z tym wyjątkiem, że pokazuje jedną rzecz, a nie każde słowo zdania odczytane z pliku osobno, zgodnie z żądaniem OP.
terdon
1

Oto skrypt w języku Python podobny do rozwiązania @ Heliobash :

#!/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
źródło