Ekranın ortasındaki kod çıktısını yazdır


10

Aşağıdaki kod file, ekranda kelime kelime ne olursa olsun çıktı verecektir . Örneğin:

Hello 1 saniye boyunca görüntülenecek ve kaybolacaktır. Ardından, cümledeki bir sonraki kelime bir saniyeliğine görünecek ve kaybolacaktır vb.

Ekranın ortasında görüntülenen her şeyi nasıl çıktılarım?

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

Tam olarak ne elde etmeye çalışıyorsunuz?
muru

bu komut ekranın sol üst köşesindeki her kelimeyi bir dosyadan görüntüler. Çıktıyı ekranın ortasında nasıl yapacağımı bilmem gerekiyor.
Nebelz Cheez

4
Evet, ama ne elde etmeye çalışıyorsunuz? Bu bir XY problemi gibi geliyor ,
muru

"Ekranın ortası" nedir? Terminalin ortası mı? Gerçek ekranın ortası? Terminali yeniden boyutlandırırsanız, metni terminalinizin boyutu ne olursa olsun ortama dinamik olarak yerleştirmek için buna ihtiyacınız var mı?
terdon

Evet. Terminalin ortası.
Nebelz Cheez

Yanıtlar:


7

İşte çok sağlam bir bash betiği:

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

8

Aşağıdaki komut dosyasını deneyin. Her giriş sözcüğü için terminalin boyutunu algılar, bu nedenle terminali çalışırken yeniden boyutlandırırsanız dinamik olarak güncellenir.

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

Farklı kaydedin ~/bin/foo.sh, yürütülebilir ( chmod a+x ~/bin/foo.sh) yapın ve girdi argümanınızı ilk argümanı olarak verin:

foo.sh file

3

bash işlevi aynı

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

ve sonra

mpt "Text to show"

1
Bu, cevabımla tam olarak aynı görünüyor, ancak tek bir şey gösteriyor ve bir cümlenin her kelimesi OP tarafından istendiği gibi ayrı bir dosyadan okunmuyor.
terdon

1

@ Helio'nun bashçözümüne benzeyen Python betiği :

#!/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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.