Edited at

自作のコマンドを作成した

More than 3 years have passed since last update.

研究の一環で何度も同じ作業するのが面倒くさくなってスプリクトを作った。だが、どうせならコマンドにしてかっこ良くしたいと思い調べた結果、サイトによってバラバラだしなんじゃこりゃってなったのでメモ。

環境はCentOS7でrootログインで説明します。


$PATH

まずコマンドを入れるところだが、環境変数である$PATHでわかる。

# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

つまり、デフォルトの状態だと以下の6つが$PATHに入ってる。

/usr/local/sbin

/usr/local/bin

/sbin

/bin

/usr/bin

/root/bin

というかそもそも$PATHとは何なのか。

何気なく打ち込んでいるコマンド。もちろんLinux内にあるファイルを実行することを示しているが、全ファイルを検索して実行しているのか。

そんな馬鹿なわけがない。

環境変数である$PATHで指定されたディレクトリ限定で検索して実行している。

例えばechoコマンドだって実際は/bin/echoが実行されているわけで、/root/echo があったところで見向きもされない。

だが、逆を返せば$PATHで指定されたところにファイルを置けばコマンドとして認識されるわけだ。

ちなみに、コマンドの場所をフルパスで調べたい場合はwhich command_nameでエンターキーカッターンしよう。


Let's try

テキトーなディレクトリ上でコマンドの中身を作成。

# vim testhello

#!/bin/sh

echo "HelloWorld!"

見て分かる通りechoコマンドで"HelloWorld!"を出す猿でも作れるスプリクトです。

そんでもって次は誰でも実行できるようにしないと行けないので権限あたりを弄ります。

# chmod a+x testhello

一応説明するとchmodは権限変更するコマンドで"a+x"は「全てのユーザーに実行権限を与える」という意味合いです。

そして仕上げに$PATHのどれかにぶち込んで、確認、実行で終了。

# cp testhello /usr/local/bin/

# which testhello
/usr/local/bin/testhello
# testhello
HelloWorld!

以上でスプリクトをコマンドにする方法終わり。


$PATHに追加する

「なんで俺が$PATHに合わせないといけないんだよ」

って人は$PATHにディレクトリを追加しましょう。

例として/root/binを$PATHに入れる。

ユーザー限定で指定したい場合は~/bash_profile

ユーザー全体で指定したい場合は/etc/profile (末尾に追加)

に以下のコマンドを追加すればOK

# PATH=$PATH:/root/bin

# export

↑のコマンド直接入力しても構わないが、毎回ログインのたびにリセットされるので注意。


被りの場合の優先度

色々コマンドを増やしていると他のディレクトリと被ることもある。

例えば/usr/local/bin/sbinで同じ名前のコマンドを入れてしまた場合$PATHの左側から優先されるので/usr/local/binに入っているコマンドが優先される。