Print output of code in the middle of the screen
Try the script below. It will detect the size of the terminal for every input word so will even dynamically update if you resize the terminal while it's running.
#!/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
Save it as ~/bin/foo.sh
, make it executable (chmod a+x ~/bin/foo.sh
) and give it your input file as its first argument:
foo.sh file
Here you're a very robust bash script:
#!/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
bash function to do the same
mpt() {
clear ;
w=$(( `tput cols ` / 2 ));
h=$(( `tput lines` / 2 ));
tput cup $h;
printf "%${w}s \n" "$1"; tput cup $h;
sleep 1;
clear;
}
and then
mpt "Text to show"