楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会

6,297 views

Published on

筑波大学 Linux User Group (つくらぐ)
http://www.tsukuba-linux.org/

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,297
On SlideShare
0
From Embeds
0
Number of Embeds
67
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Sh ボーンシェル Echoがちがう ランダムな数値を出すのも
  • slコマンド
  • AAはkim.shを起動
  • Clear | od-a
  • 33 エスケープ
  • slunk.sh
  • scr.sh
  • Sttyは端末を制御するためのコマンド オプションはすごく多い。
  • エコーバックをオフにして、rm-rf*;なんかいれる。帰ってきた人が何か入れるけど何もおこらない。エンターおす。大惨事。
  • C INT / QUIT Z TSTP Trap '' INT QUIT TSTP
  • 楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会

    1. 1. 楽しいぁゃ ι ぃシェルスクリプト 情報科学 類 1年  中森 亮介
    2. 2. 自己紹介 <ul><li>KIM(中森亮介)
    3. 3. 筑波大学情報科学類1年
    4. 4. かつては自称「普通の人」だったが、セキュキャンに参加してハッテンしてしまった人
    5. 5. 解析学Ⅰを落とした人orz
    6. 6. Web系。Adobe大好き。りなっくすなんて(ry
    7. 7. コンピュータの面白さをぁゃιく伝える闇の伝道師w
    8. 8. 技術?は楽しく!!!!!
    9. 9. 時間があればもう少し凝ったプレゼンテーション作りたかった。。。。。。。。 </li></ul>
    10. 10. これをやろうと思ったきっかけ <ul><li>ウェブプログラミング( Perl&PHP )から入ってきた僕が少しばかり成長しようとして「 Python 」を習得しようとした。
    11. 11. 「 Python チュートリアル」を読んでみた。
    12. 12. するとあるところにこんな一文を発見。
    13. 13. ” UNIXシェルスクリプトや Windows バッチファイルを書けば、そうしたタスクの一部はこなせるだろうが、シェルスクリプトはファイルの一部を動き回ってテキストデータを変更するのに適しているのであり、GUIアプリケーションやゲームには、あまり向いていない。”
    14. 14. でも、「あまり向いていない」って「不可能」ではないよね・・・・・
    15. 15. ちょうど opentaka に しつこく つくらぐに出るようにいわれた
    16. 16. ならそれをネタにしようかな?シェルスクリプトなんてあまりいじらないけど・・・・・・。 </li></ul>
    17. 17. ルール <ul><ul><li>なぜルールを定めるのか? </li></ul><li>シェルスクリプトではさまざまなコマンドを普通に実行可能。だからこそ既存アプリケーションの操作の自動化によく使われる。というか、、それが目的。
    18. 18. 制限なしならお好きな言語で作ったプログラムを実行して終わり!なんてことになりかねない
    19. 19. 「シェル」と一言にいってもいろいろな種類がある。 </li><ul><ul><ul><li>sh csh ,tcsh, bash, zsh. ・・・・・・・・
    20. 20. シェルによって動作が異なるものがあるため互換性を考慮しなければならない。どのシェルでも動くようにすることは可能だが面倒。説明する時間もあまりなさそう。 </li></ul></ul></ul></ul>
    21. 21. ルール <ul><li>シェルはBashを使う </li><ul><ul><ul><ul><ul><ul><li>Linux の標準シェルであり、しかも高機能なため使いやすい </li></ul></ul></ul></ul></ul></ul><li>使えるコマンドはシェル組み込みコマンドを基本的に用いる。画面操作や入力操作に必要なものがあれば外部のコマンドも使うが普通にLinuxをインストールすればたいてい入っている一般的なものをつかう。。 </li></ul>
    22. 22. シェル組み込みコマンド <ul><li>シェル組み込みコマンドとは? </li><ul><ul><ul><li>/binや/sbin、/usr/binなどのディレクトリに収められているプログラムではなく、シェル自身に組み込まれているコマンド。
    23. 23. それはどうすればわかる? </li><ul><li>helpコマンドを実行するとぶわぁぁぁと出てくる。
    24. 24. 1つ1つのコマンドが組み込みコマンドであるかどうかを知りたいときには、typeコマンドを使えばいい。bashなら。 </li></ul></ul></ul></ul></ul>
    25. 25. シェル組み込みコマンド $ type echo echo is a shell builtin  ← 組み込みコマンド $ type lv lv is /usr/bin/lv  ← /usr/bin  にあるコマンド
    26. 26. 実際に何か作ってみよう① <ul><li>アニメを作ってみましょう
    27. 27. *nixといえばやっぱ「アレ」は欠かせないでしょう。しゅしゅぽっぽー。 </li></ul>
    28. 28. 何か表示してみよう <ul><li>とりあえずなにか表示してみよう
    29. 29. #!/bin/bash
    30. 30. echo 'Hello'
    31. 31. 何か感じませんか?もっとやってみましょう。
    32. 32. AAが出ましたね。 </li><ul><ul><ul><li>よく考えてみると今まで表示しているものの下に表示されている。
    33. 33. 全画面表示はできないのかな? </li></ul></ul></ul></ul>
    34. 34. 全画面表示をする方法 <ul><li>きわめて簡単です。 </li><ul><ul><ul><ul><ul><li>全画面消去してから改めて表示すればいい。
    35. 35. Clear しちゃえばいい </li></ul></ul></ul></ul></ul></ul>
    36. 36. せっかくだしほかの方法でやってみよう <ul>$ type clear clear is /usr/bin/clear <ul><ul><ul><li>clearは当然ながらシェル組み込みコマンドじゃない
    37. 37. 実は echoだけでできたりする。 </li></ul></ul></ul><li>これらのプログラムは端末エミュレータに表示される。そこに「何か」を送っている? </li></ul>
    38. 38. エスケープシーケンス <ul><li>画面表示に関することは通常標準出力がつかさどっているということですよね。
    39. 39. となると画面表示がクリアされるのは「画面表示を消すための命令」が標準出力として端末エミュレータに出力されているからでは?
    40. 40. コマンドライン環境で画面クリアやカーソル移動や文字色変更などの画面操作を行うにはASCIIコードのESC(16進数で0x1bのコード)とそれに続く決められた文字列によるエスケープシーケンスが用いられる </li></ul>
    41. 41. つーか、端末エミュレータって何????? <ul><li>みんながコマンド操作するときに使っているアレ。xtermとか。Windowsのコマンドプロンプトだって端末エミュレータの一種ととらえられるかもしれない
    42. 42. Linuxについてるものは「DEC VT100」とよばれる端末(遠隔操作専用のコンピュータ?大昔は実機を使っていたらしい)とおなじような動きをエミュレーションするようになっている。画面操作につかうエスケープシーケンスも同じ。VT100で検索すればエスケープシーケンス一覧がでてくる。 </li></ul>
    43. 43. DEC VT100(VT180)の写真 ウィキペディア日本語版(VT100)より引用
    44. 44. エスケープシーケンスを調べてみよう <ul><li>odコマンドを使えばいい。 </li><ul><ul><li>od コマンドとは &quot;man od&quot; によるとファイルや標準入力を 8 進数(またはほかの形式)で出力するコマンド </li></ul></ul><li>これにclearの出力をぶち込めばいい。
    45. 45. オプションには -a (文字の名前で出力)を使う。
    46. 46. clearコマンドを使う </li><ul><ul><ul><ul><li>標準出力->端末(画面が消去される) </li></ul></ul></ul></ul><li>clear | od -a
    47. 47. 標準出力->odコマンド->端末(これならどんなものが出力されているか見える!) </li></ul>
    48. 48. 実際にやってみた。 <ul><li>実演してみましょう </li></ul>
    49. 49. 実際にやってみた <ul>$ clear | od -a 0000000 033 ESC [ H ESC [ 2 J <li>確かにエスケープの後に何かある。
    50. 50. ESCはbash組み込みのechoではe(バックスラッシュe)であらわせる。
    51. 51. echo 'e[He[2Jc'(最後のcは余計な改行コードをつけさせないため)と入れてやると、クリアができます。 </li></ul>
    52. 52. echoしてみよう。 <ul><li>echo 'e[He[2Jc'
    53. 53. なぜか文字がそのまま出力された!
    54. 54. Bashのechoはオプションなしではそのまんま出力するようになっている。
    55. 55. -eオプションが必要。これでOK. </li></ul>
    56. 56. これだけわかれば何ができるの? <ul><li>表示->全画面クリア->表示->全画面クリア->表示・・・・・・
    57. 57. アニメができる </li></ul>
    58. 58. 実際にやってみた。
    59. 59. どうやって動いているのか? <ul><li>1行ごと表示して、一定時間たったら全消去してまたずらして表示
    60. 60. sleepコマンド(GNU sleep)を使用している
    61. 61. sleepのかわりにシェル組み込みコマンドで無理やりやる解決法が存在するらしい。 </li></ul>
    62. 62. 一定時間後に処理をするための無理やりな解決策の一例 <ul><li>for (( i=0; i<適当なでかい数; i++ ));do
    63. 63. echo &quot;unk&quot; >/dev/null
    64. 64. done
    65. 65. 時間のかかる無駄な処理をわざと組み込んで間隔をあける方法。ほかにもバリエーションがたくさん存在する。無理やりすぎる。 </li></ul>
    66. 66. まだ欠点はある。 <ul><li>画面の左上にしか表示されていない
    67. 67. カーソル移動をtputで。。。。でもechoもしたいよね?
    68. 68. また od -aを使ってエスケープシーケンスを見つけ出す・・・といいたいところだけど時間的にきついのでVT100のエスケープシーケンス表を使う
    69. 69. 終了すると画面が実行前の状態に戻っていない。
    70. 70. ->emacsやvimは終了すると元の画面に戻る </li></ul>
    71. 71. カーソルを移動する <ul><li>カーソル移動はtput cup x yでできる。
    72. 72. x y は画面の左上を基準とした数字を入れる。ただし0から数えるので注意
    73. 73. 1行目の3文字目なら
    74. 74. tput cup 0 2でできる。
    75. 75. echo でやるなら 
    76. 76. echo -e 'e[ y ; e x Hc' でできる
    77. 77. echoなら1から数える。そしてxyが逆になっている。これをミスると表示がとんでもないことになる。 </li></ul>
    78. 78. スクリーンの中にスクリーンを開く <ul><li>画面切り替えができるアプリケーションはスクリーンの中にスクリーンを開いている。元の画面に戻っているのはスクリーンの中のスクリーンを閉じている。
    79. 79. スクリーンの中にスクリーンを開くエスケープシーケンスが存在する。それを使えばいい。当然閉じるものもある。あと、スクリーンを閉じたときに元の位置にカーソルを戻さなければならない。カーソル位置を記憶するエスケープシーケンスがあるのでそれを使う。 </li></ul>
    80. 80. スクリーンの中にスクリーンを開く <ul><li>スクリーンを開く ESC [ ? 4 7 h
    81. 81. スクリーンを閉じる ESC [ ? 4 7 L
    82. 82. カーソル記憶 ESC 7
    83. 83. 記憶した位置に戻す ESC 8
    84. 84. カーソル記憶->スクリーンを開く->スクリーンを閉じる->記憶した位置にカーソルを戻す。 </li></ul>
    85. 85. シェルスクリプトだけで簡単なゲームを作ってみよう <ul><li>やっぱり最初のコンピュータで動かすゲームっていうと
    86. 86. やっぱテ○リス!!!(テトリスは登録商標です) </li></ul>
    87. 87. ゲームを作る流れ <ul><li>先ほどに説明したことはゲーム作りには必要
    88. 88. でもいちいち打つのは面倒
    89. 89. プログラムの最初にシェル関数を定義しておいて、あとのプログラムではそれを使う </li></ul>
    90. 90. ゲームには何がいる? <ul><li>シェルスクリプト中でのキー入力はエンターを押して初めて受け付けられる。
    91. 91. でも、ゲームの操作ではエンターなしで受け付けられないと話にならない。
    92. 92. また、シェル上でのキー入力は基本的に画面に出力される(エコーバック)。
    93. 93. しかし、移動したりするたびに移動に割り当てられたキーの文字(例:WASDとか HJKL )が出力されるとやっていられない
    94. 94. よって、エコーバックをオフにする!
    95. 95. あと、カーソルキーでも移動したいよね。 </li></ul>
    96. 96. エンターなしでキー入力を受け付ける <ul><li>Bashならreadコマンドで1発。
    97. 97. -s -n 1 オプションをつけるだけ。
    98. 98. 何度もいうけどBashじゃないとだめです
    99. 99. ちなみにBash以外ではsttyコマンドとddコマンドを組み合わせるらしい。ddコマンドってw </li></ul>
    100. 100. エコーバックをオフにする <ul><li>stty -echoでエコーバックをオフにできる
    101. 101. stty echo でエコーバックをオンにできる
    102. 102. エコーバックをオフにして遊んだ後は必ずオンに戻さないと大変なことになりますwwwwww
    103. 103. sttyコマンドをいたずらには使わないでね。計算機室にログインしっぱなしのマシンがあったりしても触らないように。 </li></ul>
    104. 104. でも、エコーバックのオフはやばい <ul><li>エコーバックがオフのままだと何を入力しているのかわからない。画面には何も表示されていないけど
    105. 105. 「rm -rf *」なんかを無意識に入力していたりしていたりして。当然見た目にはわからないから気づかない。いたずらには使わないでね。
    106. 106. 終了シェル関数を作ってちゃんと終了処理を実装してやれば問題ない。と、いいたいところだけどCtrl-Cされたらどうなることやら・・・・・・・・。 </li></ul>
    107. 107. エコーバックオフのままの終了を阻止する <ul><li>Ctrl-Cを押すとINTシグナルというものが送られて強制終了する。Ctrl-/とかCtrl-Zなんかも同じようにしてほかのシグナルが送られる。それを無視してやればいい。
    108. 108. trap ’’ INT で無視できる。bashなら。ほかのも同じようにできる。’’にコマンドを入れればその中のコマンドを実行させることもできる。何も入れなければ何もしない。まとめて指定することもできる。
    109. 109. ただし「KILLシグナル」は無効化できないので。どういうときにKILLが使われるかはご想像のとおりです。強制終了を無効化するとまずい。 </li></ul>
    110. 110. カーソルキーでの移動 <ul><li>エスケープシーケンスはこうなっている
    111. 111. ↑ ESC [ A
    112. 112. ↓ ESC [ B
    113. 113. -> ESC [ C
    114. 114. ← ESC [ D
    115. 115. エスケープシーケンス全部を判別に使う方法もあるけど、違うのは最後の1文字だけ。ABCDだけで判別できそう。その方法を使うとWASD移動との両立ができなくなっちゃうけど・・・。まーいっか。簡単に済むし。 </li></ul>
    116. 116. 最後に個人的な見解 <ul><li>このようなことをシェルスクリプトでやる意味はない!!!!と思う。正直すごく大変だった。不具合たっぷり。わけわからん。
    117. 117. でもほかのコマンドを組み合わせて使いやすくする本来の使い方をするときに無味乾燥な端末に彩を添えることができるかも知れません。
    118. 118. でもわざわざシェルスクリプトを使う意味はあるの?
    119. 119. 多分ない。でも、シェルスクリプトが使えない環境はまず存在しないのでどこでもぁゃιぃものを表示することができる。 </li></ul>
    120. 120. ご清聴ありがとうございました。

    ×