図書館でLinuxの入門本を2冊借りました。
だいぶと古い本ですが、そのどちらにも「sl」コマンドが紹介されていました。
ジョークコマンドでslと打つと、端末上でSL機関車が走り出す、というもの。
一覧表示のlsをタイプミスしたときに出るっていうのが狙いのようです。
日本の方が作ったんかな?
ぶっちゃけ何の実益もないですが、入れたくなったので入れてみました。
ということでキャプチャがこちら。
画像だと伝わらないですが、この機関車が右から左に走っていくアニメーションが見れます。
ターミナルでアニメーションが見れるなんて感動です。
ちなみにインストールは以下のコマンドです。
sudo apt install sl
もし、見つからない、って言われた場合は更新してみてください。
sudo apt update
ここまで豪華なアニメーションはめんどいけど、ちょっとなにか表示するくらいのコマンドなら自分も作れそうな気がする、と思ったけど、よくよく考えたらHello,Worldの延長なんや、ということに気づいたので作ってみました。
さすがにアニメーションはしないけど、Linuxのマスコット、タックスのテキストアートが5秒間表示されます。
もとのテキストアートはこちら
組込をやっていたので、C言語自体は大丈夫なんやけど、printとか使わんので文字列出力でえらい苦労した…
ほんとは日本語のアスキーアートにしたかったけど、文字化けの直し方がわからんかったので断念。
curses ライブラリ、というライブラリを使いますが、これの使い方も全然わからんかったので苦労しました。
gccでのライブラリを使ったビルドの仕方も知らなかったので。
ちなみに以下のような感じになります。
test.cというファイルをapptestというコマンド(オブジェクト)にビルドしたい場合です。
gcc -o apptest test.c -l curses
slコマンドのように、コマンド実行時に端末の表示を一旦全部消すっていうやり方が全然わからなくて、clear関数を試したりとか、かなり試行錯誤しました。
結果的には、cursesの描画関数(自分の場合はmvprintw() )を使えばいいだけでした。
パスを通せば、slコマンドみたいにどこでもコマンドを打つだけで表示されるようになりますが、それはまた別の記事でまとめるかな。
curses ライブラリについては、以下のサイト様を参考にさせていただきました。
Programming Essentials - curses library
ということで、せっかくなのでコード全文です。
誰かのお役に立てれば。
#include <stdio.h> #include <curses.h> /* curses */ #include <unistd.h> /* sleep */ /* 表示位置 */ #define DISP_ROW 2 #define DISP_CLM 5 /* テキストアート */ #define TEXTART_ROW 16 #define TEXTART_CLM 37 char textart[TEXTART_ROW][TEXTART_CLM] = { {" _nnnn_ "}, {" dGGGGMMb ,.............. "}, {" @p~qp~~qMb | Linux Rules! |"}, {" M|@||@) M| _;..............'"}, {" @,----.JM| -' "}, {" JS^\\__/ qKL "}, {" dZP qKRb "}, {" dZP qKKb "}, {" fZP SMMb "}, {" HZM MMMM "}, {" FqM MMMM "}, {" __| \". |\\dS\"qML "}, {" | `. | `'\\Zq "}, {"_) \\.___.,| .' "}, {"\\____ )MMMMMM| .' "}, {" `-' `--' hjm "} }; /* メイン処理 */ int main(int argc, char *argv[]) { int i; initscr(); /* スクリーンを初期化する */ curs_set(0); /* カーソル非表示 */ /* 端末の上から2行目、左から5文字目から描画 */ for( i=0; i < TEXTART_ROW ; i++ ){ mvprintw(DISP_ROW + i, DISP_CLM, "%.37s", textart[i] ); } refresh(); /* リフレッシュして表示 */ sleep(5); /* 5秒まち */ endwin(); /* cursesの終了処理 */ }