Skip to content

Instantly share code, notes, and snippets.

@papiron
Last active December 8, 2016 02:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save papiron/78efbb18253d26c4af979c5e9cd34474 to your computer and use it in GitHub Desktop.
Save papiron/78efbb18253d26c4af979c5e9cd34474 to your computer and use it in GitHub Desktop.
BSDのbannerコマンドで出力させたバナーを横にしてスクロールさせるシェルスクリプト
#!/bin/sh
# 必要な追加ソフトウェア: GNU sed、BSD付属のbanner
# Macの場合: $ brew install gnu-sed
# FreeBSDの場合: $ sudo pkg install gsed
# Ubuntuの場合: $ sudo apt install bsdutils
[ $# -lt 1 ] && echo 'Usage: scrollbanner STRING [HEIGHT]' && exit
string="$1"
if [ -z $2 ]; then
height=30
else
height="$2"
fi
banner -w $height "$string " | ## Ubuntuの場合は banner -> printerbannerに修正
sed p |
awk '{printf "%-'$height's\n", $0}' |
tr '# ' '+-' |
sed 's/./& /g' |
rs -T |
tail -r |
tr -d ' ' |
xargs printf "%`tput cols`s\n" |
tr ' ' '-' |
sed 's/$/\\n/' |
tr -d '\n' |
gsed ':a;p;s/\([+-][+-]\)\([+-]*\)\\n/\2\1\\n/g;ba' | ## Ubuntuの場合は gsed -> sedに修正
sed 's/.*/"&"/' |
tr '+-' '# ' |
sed 's/.*/clear; echo -e &; sleep 0.1/' |
bash |
cut -c1-`tput cols`
@papiron
Copy link
Author

papiron commented Dec 5, 2016

考える元になったワンライナー

#Mac/FreeBSD
$ banner -w 30 'ShellGei! ' | awk '{printf "%-30s\n",$0}' | tr '# ' '+-' | sed 's/./& /g' | rs -T | tail -r | tr -d ' ' | sed 's/$/\\n/' | tr -d '\n' | gsed ':a;p;s/\([+-]\)\([+-]*\)\\n/\2\1\\n/g;ba' | sed 's/.*/"&"/' | tr '+-' '# ' | sed 's/.*/clear; echo -e &; sleep 0.1/' | bash

#Ubuntu(未検証)
$ printerbanner -w 30 'ShellGei! ' | awk '{printf "%-30s\n",$0}' | tr '# ' '+-' | sed 's/./& /g' | rs -T | tail -r | tr -d ' ' | sed 's/$/\\n/' | tr -d '\n' | sed ':a;p;s/\([+-]\)\([+-]*\)\\n/\2\1\\n/g;ba' | sed 's/.*/"&"/' | tr '+-' '# ' | sed 's/.*/clear; echo -e &; sleep 0.1/' | bash

@papiron
Copy link
Author

papiron commented Dec 6, 2016

イメージはThe電光掲示板。
bannerコマンドの出力そのままだと表示が縦長になってしまっていたので、横に2倍にしてバランスを取っています。
長い文字列を指定しても大丈夫なように、端末の幅(列数)で切っています。
端末の列数をresizeコマンドで取得しています。FreeBSDにresizeコマンドが見当たらないのが困った。Ubuntu用は後ほど。
bashのecho -eに依存しているのが微妙。

@papiron
Copy link
Author

papiron commented Dec 6, 2016

Macのresizeコマンドですが、/opt/X11/bin/resizeにありました。
ということはこれってXquartz付属ということか?X関連をインストールする必要がありそうです。
resizeコマンドを使わずに端末の幅を取得出来ないですかねえ?
bashのシェル変数LINESとCOLUMNSは、シェルスクリプトからでは取得不能でした。(インタラクティブモードじゃないとダメっぽい)

@papiron
Copy link
Author

papiron commented Dec 6, 2016

これがヒントになりそう??
https://gist.github.com/s-hiiragi/09499284172ca1fa7f3f

@papiron
Copy link
Author

papiron commented Dec 6, 2016

Twitterでヒントをいただきました。tputコマンドとsttyコマンド。
https://twitter.com/Heliac1999/status/805955949554855940
https://twitter.com/h_uta/status/806129015710826497
後藤さんのtputに関する記事。
http://news.mynavi.jp/articles/2011/01/12/tput-of-ubuntu-and-freebsd/

@papiron
Copy link
Author

papiron commented Dec 6, 2016

gaucheで書いたそうです。
http://valvallow.blogspot.jp/2013/06/shellmarquee.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment