## 作業の自動化
「黒い画面」での作業は文字を打ち込むだけの単純で厳密な手順なので簡単に自動化できます。
例えば、僕は [lokka](https://github.com/lokka/lokka) というソフトを作っていますが、新しいバージョンをリリースする時に、その時の最新のファイルをダウンロードしてきてzipファイルに固める必要があります。下記のようなコマンドでそれが可能です。
````sh
$ git clone https://github.com/lokka/lokka.git lokka
$ zip -r lokka.zip lokka
$ rm -r lokka
````
git というコマンドで最新のファイルをlokkaというディレクトリ名でダウンロードしてきて、zip コマンドで zip に圧縮し、元のディレクトリはもう要らないので rm コマンドで削除しています。
実はこれをそのままファイルに書くだけで自動化が可能です。make-lokka-zipfile という分り易いファイル名に上記コマンドを書きました。cat コマンドで確認するとこんな感じです。
````sh
$ cat make-lokka-zipfile
git clone https://github.com/lokka/lokka.git lokka
zip -r lokka.zip lokka
rm -r lokka
````
そのままです。「黒い画面」に打ち込んでいた文字をファイルに書いただけですね。そのファイルを実行するには下記のようにshコマンドに渡します。
````sh
$ sh make-lokka-zipfile
````
ファイルの中に書いたコマンドを順番に実行してくれます。このようにやって欲しいコマンドを順番に書いたファイルを script(スクリプト)と言います。script は演劇などの台本という意味なのでそのままですね。台本通りに「黒い画面」が動いてくれるわけです。php プログラムの事を php スクリプトと言ったりすることがありますが、program(プログラム)も予定表・計画表という意味なので殆ど同じ意味です。
ただ一点、`sh` という謎のプログラムにファイルを渡して実行するという書き方がどうも野暮ったいです。`ls` みたいに自分の書いたスクリプトもコマンドっぽく実行したいところです。
## 謎のおまじない shebang(シバン)
「黒い画面」にはスクリプトを単体で実行するために `shebang`(シバン)という機能があります。
例として、 `echo-hello` というファイルをviで作成・編集し、保存、実行してみます。
( 下記の `komagata` の部分は自分自身のユーザー名に読み換えてください )
まずファイル名を指定し、編集画面(エディタ)を表示させます。
````sh
$ vi /home/komagata/echo-hello
````
開いたエディタで次の内容を書きます。
````sh
#!/bin/sh
echo hello
````
上記を保存して実行してみてください。
````sh
$ chmod u+x echo-hello
$ /home/komagata/echo-hello
hello
````
`echo-hello` というファイルに書いた処理が実行されています。
`chmod` は Chenge MODe の略でファイルの権限を変更するコマンドです。`echo-hello` というファイルにユーザー実行権限(u+x)を追加しています。
`shebang` とは1行目の最初の2文字
````sh
#!
````
の事です。sharp bang が短くなって shebang となったそうです。また、アメリカの俗語、the whole shebang(何もかも、一切合切)というのと掛けてるという説もあるそうです。シャープはわかります!が「バン!」って感じなのは日本人にはわかり辛いですね。でも #! の事を日本人は「シャープびっくり」と言ったりするので似たようなもんだと思います。
`shebang` は何なのかというと、
> 黒い画面で実行しようとしたファイルの1行目の最初の二文字が#!だったら、その後に書いてあるコマンドに2行目以降の全てを渡す
という機能です。
![Image from Gyazo](https://i.gyazo.com/571929fe535e758b2e08bff407ce3e32.png)
もう「黒い画面」を作った人がそうなるように作りましたという以外に説明しようがないそのままの機能です。確かに便利ですが、他にやりようは無かったのか疑問です。
この `shebang` を利用すれば様々なスクリプトを単体で実行できる独自のコマンドにすることができます。
![Image from Gyazo](https://i.gyazo.com/4282b3d48dd8ce9c59455215dfbade69.png)
プログラミング言語のrubyもスクリプトを rubyコマンドに渡すという点では全く同じなのでこうやって独自のスクリプトを作ることが出来ます。
しかし当然、普通のテキストファイルで、もしファイルの一行目最初の2文字が `#!` だったら、2行目以降を1行目のプログラムに渡して実行しようとします。
![Image from Gyazo](https://i.gyazo.com/da6546acae7a929a54677a501981ac97.png)
もちろん foo などというコマンドは無いのでエラーになります。interpreter(インタプリタ)というのはshやrubyのようにスクリプトを実行する種類のプログラムのことです。
## PATH を設定する
自分独自のスクリプトはどこに置けばいいのでしょうか。`/bin` や `/usr/bin` はシステムの動作に必要なコマンドを置く場所です。`/usr/local/bin` は全ユーザー(例えばkomagataとmachida)で共有するようなコマンドなら置いても構わないでしょう。今回作ったような自分だけが使うようなスクリプトはホームディレクトリにbinというディレクトリを作ってそこに置く人が多いようです。
````sh
$ mkdir bin
$ mv make-lokka-zipfile bin/
````
置きました。しかし`/home/komagata/bin` は以前説明した PATH に含まれてないのでいちいちフルパスで打つ必要があって不便です。そこで自分で PATHを 設定してみましょう。
````sh
$ export PATH=$PATH:~/bin
````
export は環境変数を設定するコマンドです。env コマンドの出力結果のように環境変数名と中身を =(イコール)で区切って渡すとその値に設定されます。
`~/bin` というのは妙ですね。これは `$HOME/bin` と同じ意味です。「黒い画面」では `$HOME `を 「~(チルダ)」一文字で表すことができます。
環境変数PATHは「:(コロン)」で区切ってディレクトリ名をつなげたものでした。上記は「今までPATHに設定されてたものに `~/bin` を追加する」という意味になります。
````sh
$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/home/komagata/bin
````
echo で確認するとちゃんと `/home/komagata/bin` が PATH に追加されているのがわかります。($PATHの中身は環境によって異なります)
````sh
$ make-lokka-zipfile
````
これで自分独自のスクリプトがまるでコマンドのように使えるようになりました。便利ですね。
面倒な手順や覚え辛いオプションの組み合わせなどはスクリプトにしてしまいましょう。
<div class="tips">
<h3>作業を自動化して差をつけろ</h3>
<p>今回覚えたように「黒い画面」で行う処理は簡単にスクリプトにすることができます。スクリプトを書いておけば2度目は自動的に一瞬で作業が終わるので仕事の効率化に役立ちます。</p>
<p>以前、イベントのサイトを作る仕事がありました。イベントで撮った写真を次の日にはサイトに載せなければいけません。ところがその日のイベントの写真は600枚以上もあったのでとてもPhotoshopで一つ一つ縮小・形式変換していては間に合いません。</p>
<p>そこで<a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>というソフトのconvertというコマンドを使って、フォルダ内のファイル全てをリサイズして変換するというスクリプトを書いて、数十分で処理を終わらせました。そしてイベントがあるたびにそのスクリプトを実行すればいいようになったのでとても助かりました。</p>
<p>ImageMagickはもちろんaptでインストールできます。</p>
<pre class=" language-bash"><code class=" language-bash">$ sudo apt install imagemagick</code></pre>
<p>このように「黒い画面」は自動化ととても相性がいいのです。</p>
</div>
[「本当は怖くない黒い画面」入門(Windows \+ WSL2編) Part.9](https://bootcamp.fjord.jp/articles/28)へ続く。
ブログ