見出し画像

シェル組み込みコマンドか外部コマンドかを調べる方法

はじめまして。インフラエンジニアの石川です。 LinuxやCLIが大好きなのでLinuxのコマンドの使い方を中心にエンジニアリングに役立つヒントを伝えていきたいと思っています。

あるコマンドを実行したときに、環境によってコマンドの実行した結果のフォーマットなどが異なっていた経験をしたことはありますでしょうか。
例えば、コマンドやシェルの実行時間を調べる「time」コマンドがあります。timeコマンドにはシェル組み込みコマンドと外部コマンドとの2つがあります。


はじめに

以下の実行例は以下の環境で実施しました。

$ cat /etc/redhat-release
CentOS Linux release 8.4.2105

$ printenv SHELL
/bin/bash

シェル組み込みコマンドと外部コマンドの違いを実感してみよう

timeコマンドを例にしてシェル組み込みコマンドと外部コマンドの違いを見てみましょう。

シェル組み込みコマンド

シェル組み込みのtimeコマンドでdateコマンドの実行時間を表示してみます。パスを指定しない場合、シェルの組み込みコマンドが実行されます。

$ time date
Thu Nov  4 09:17:47 JST 2021

real    0m0.001s
user    0m0.000s
sys     0m0.001s

見慣れている表示結果かと思います。

外部コマンド

外部のtimeコマンドでdateコマンドの実行時間を表示してみます。

$ /usr/bin/time date
Thu Nov  4 09:17:53 JST 2021
0.00user 0.00system 0:00.00elapsed 89%CPU (0avgtext+0avgdata 1988maxresident)k
0inputs+0outputs (0major+84minor)pagefaults 0swaps

なんと!CPUの実行時間だけでなくメモリやI/Oの情報も表示されていますね。

シェル組み込みコマンドか外部コマンドかを調べる方法

パスを指定しないで実行したコマンドがシェル組み込みコマンドなのか外部コマンドかを調べるにはどうしたらよいでしょうか?

typeコマンドを使うことでシェル組み込みコマンドか外部コマンドかを調べることができます。

type コマンド名

先ほどの例で出したtimeコマンドを調べてみましょう。

$ type time
time is a shell keyword

この環境では、シェル組み込みのtimeがデフォルトで動くようです。

外部コマンドの例としてwhichコマンドを調べてみます。

$ type which
which is aliased to `(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'

whichコマンドは、外部コマンド/usr/bin/whichのエイリアスのようです。

そのコマンドが置いてある場所を全て表示する方法

シェル組み込みコマンドや外部コマンドに限らず、そのコマンドが置いてある場所をすべて表示するにはどうしたらよいでしょうか。

typeコマンドの-aオプションを利用することで、そのコマンドが置いてある全ての場所を表示することができます。 timeコマンドが置いてあるすべての場所を表示してみましょう。

$ type -a time
time is a shell keyword
time is /usr/bin/time

シェル組み込み(shell keyword)と外部(/usr/bin/time)の2つがありますね。 シェル組み込みと外部コマンドがある場合、パスの指定なしにコマンドを実行するとシェル組み込みコマンドが優先的に利用されます。

さいごに

本記事ではシェル組み込みコマンドと外部コマンドの違いと見分け方について説明しました。

利用する環境によってコマンドの実行結果(表示)が異なる場合があります。想定していた結果と違う表示になった場合はそのコマンドがシェル組み込みコマンドなのか外部コマンドなのかを確認してみてください。

__________________________________

執筆者プロフィール:石川 淳
SIerでITインフラアーキテクトを15年以上経験。その後、スマートフォン向けゲームアプリのインフラエンジニアを5年ほど経験。現在もAWSを中心としたITインフラの設計、構築、運用を行っています。最近の趣味はWingFoil。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/