#はじめに
自分で作ったシェルスクリプト(.sh)をコマンドにする方法をまとめたものです。
#リンク(ln)について
lnは、任意のファイルもしくはディレクトリ(以下、ターゲットと呼称)と紐づいた、特殊なファイルを作るコマンドのことです。lnではハード・リンクとシンボリック・リンクの2種類のファイルを作成することができ、それぞれに違った特徴があります。
#####ハード・リンク
lnにオプションを付けなかった場合に作成されるリンクです。ターゲットにはファイルのみが指定でき、ディレクトリを指定することはできません。ハード・リンクは、いわゆるコピーに似た振る舞いをするため、ターゲットが消えてしまってもデータを参照、実行することが可能です。しかし、厳密には、ターゲットと同じiノード(ポインタやサイズ、作成日時などを含むデータ)を参照しているだけで、実態となるデータを複製しているわけではないため、ディスク容量はほとんど増加しません。ちなみに、#ls -l
からターゲットを特定することはできません。
#####シンボリックリンク・リンク
lnにオプションとして-sを付けると作成されるリンクです。ターゲットにはファイルとディレクトリの両方が指定できます。シンボリックリンク・リンクは、ターゲット自体を参照する0バイトのリンクを作るため、ターゲットが消えるとリンクは働かなくなります。いわゆるショートカットを作っているとお考え下さい。ターゲットは#ls -l
コマンドから特定できます。
#自作コマンドを作ってみる
以上のことを踏まえて簡単に自作コマンドを作ってみます。自作コマンドを作るにあたってはシェルスクリプト(.sh)を使用しますので、シェルスクリプトの詳細については別途参照してください。
まずは、ターゲットとなるスクリプトを# vim ~/target.sh
でホームディレクトリに作ります。
#!/bin/sh
echo "Hello World"
# sh ~/target.sh
で動作することを確認してください。
次にshを省いても動作するように# sudo chmod a+x ~/target.sh
で実行権限を与えます。
これで# ~/target.sh
で動作するようになっていると思います(相対パスでは動作しません)。
ここまで来たら自作コマンドはほぼて出来ている状態なので、あとはどこからでもこのコマンドを利用できるように、パスの通ったディレクトリにlnでターゲットのリンクを作成します。今回はハード・リンクとシンボリック・リンクの違いを検証できるように両方作ってみます。
# sudo ln ~/target.sh /usr/local/bin/hard
# sudo ln -s ~/target.sh /usr/local/bin/symbolic
# hard
や# symbolic
で自作コマンドを試してみて下さい。Hello Worldが出力されると思います。
最後に# rm ~/target.sh
でターゲットを消してみます。
もう一度# hard
や# symbolic
で自作コマンドを試してみて下さい。シンボリック・リンクが動作しなくなったことが確認できると思います。