ShellScript
Bash
Linux
Debian
初心者

Linuxコマンドのソースコードを取得する方法:オリジナルコマンド作成前の勉強向け

More than 1 year has passed since last update.


前置き

CQ出版社のInterface誌(2016年10月号)に、「レベルアップ! オリジナル・コマンドを

作る」という記事がありました。

この記事中では、C言語(高速な言語)による自作コマンドの作成について、少しだけ触れられていました。

残念な事に、C言語による具体的な作成方法が記載されていませんでした。

この理由には、「紙面の文字数制限」、「bashの特集記事であった事」が考えられます。

C言語で自作コマンドを作成する上で、以下の2点が必要な情報ではないかと考え、

私は、ついカッとなって、本記事を作りました(ついでに、Interface誌にもアンケートを出しました)。

 ・自作コマンド作成時の参考(既存コマンドのソースコード)の取得方法

 ・自作コマンド(実行形式ファイル)の格納先

ちなみに、「lsを読まずにプログラマを名乗るな!(秀和システム)」なんて恐ろしい書籍もありますし、

コマンド(パッケージ)のソースコード取得は、プログラマなら覚えておいて損はないと思います。


検証環境

 ・iMac(OS X El Capitan 10.11.4)

 ・VirtualBox(5.0.26 r108824)

 ・Debian8.5(64bit)

※本記事では、CUI/GUIでのソースコードの取得方法を取り上げます。

 GUIの場合は上記の環境にこだわる必要はありません。


一般的なコマンドの格納先

Linuxのコマンドの格納先は、以下のディレクトリです。

自作コマンドの格納が推奨されているディレクトリは、/usr/local/bin です。

dir
役割

/bin
一般的なコマンド格納先(cat、rmなど)

/usr/bin
一般ユーザ向けコマンド格納先(make、wgetなど)

/usr/sbin
管理者向けコマンド格納先(chroot、useraddなど)

/usr/local/bin
評価版パッケージや自作コマンドの格納先

特定のコマンドの格納先が知りたい場合は、下記のコマンドでパスを取得できます。

コマンド名
機能

whereis
コマンド格納先、manの格納先を表示する。

which
コマンドの格納先を表示する。


コマンドのソースコードの取得方法(CUI)

まず、コマンドが提供されるパッケージ名を調査します。

今回は、mkdirコマンドを例にします。

$ sudo apt-get install dpkg-dev  # この手順は不要な環境が存在します。

$ which mkdir # mkdir格納先(絶対パス)を取得。
/bin/mkdir
$ dpkg --search /bin/mkdir
coreutils: /bin/mkdir

上記のdpkgコマンドにより、mkdirはcoreutilsパッケージで提供される事が分かりました。

なお、apt-fileコマンドを用いて、パッケージ名を取得する方法もあります。

ただし、こちらの方法は、複数のパッケージ名や関係のないディレクトリも表示されます。

$ sudo apt-get install apt-file  # この手順は不要な環境が存在します。

$ apt-file update # データベースの更新。
$ which mkdir # mkdir格納先(絶対パス)を取得。
/bin/mkdir
$ apt-file search /bin/mkdir # grepコマンド(パイプ)で取捨選択した方が好ましい。
9base: /usr/lib/plan9/bin/mkdir
coreutils: /bin/mkdir
klibc-utils: /usr/lib/klibc/bin/mkdir
xutils-dev: /usr/bin/mkdirhier

では、最後にapt-getコマンドで該当パッケージをソースコード形式で取得します。

ソースと同時に、パッチやdscファイルが付いてきますが、

これらはDebian環境下のパッケージ管理に関わる内容なので、今回は無視します。

(パッチは当てた方が良いですが……)

$ apt-get source coreutils

$ ls
coreutils-8.23 coreutils_8.23-4.diff.gz
coreutils_8.23-4.dsc coreutils_8.23.orig.tar.gz
$ cd coreutils-8.23/src # coreutils-8.23以下のファイルは、Debianの流儀に沿った内容となります。
$ ls | grep mkdir # mkdir以外のコマンド(ソースコード)が格納されているため、grepを使用。
mkdir.c

ちなみに、mkdir.cの行数は約300行でした(コメント含む)。

この程度の規模であれば、大学生でも簡単に読めると思います(関数ポインタがありますが)。


コマンドのソースコードの取得方法(GUI)

一例ですが、以下のサイトからパッケージ名を検索して、ソースを取得する事ができます。

 ・Debian公式サイト

 ・Ubuntu公式サイト

 ・GNUオペレーティング・システム


最後に

mkdirのソースを読みながら、「C言語で自作コマンドを作成するメリット(速度以外)」を考えました。

まず、UNIX哲学に則れば、一つの事を上手くやるコードを書かなければいけません。

しかし、Linuxが25周年を迎えた現在、下手にコマンドを自作するより、

OSSに存在するパッケージを活用した方が早い気がします。

そもそも、システムコールに精通していなければ、コマンドを作成するのは難しいと考えられます。

(システムコールに関しては、「Linuxプログラミングインターフェース」が名著です。)

そう考えると、C言語でコマンドを作成するメリットに関する掘り下げが、Interface誌で欲しかったです。

でも、特集としてはbash(シェルスクリプト)でしたし、雑誌に多くの情報を求めるのは酷か。