このページでは、特にプログラマーの方に是非覚えておいてほしい「Mac のコマンド」を紹介していきます。
下記ページでも Mac のコマンドを紹介していますが、PC 初心者の方でも馴染みのある「ファイル」や「フォルダ(ディレクトリ)」を扱う、どちらかというと初心者の方向けのコマンドを紹介しました。
それに対し、このページではプロセスやネットワークなどの前提知識が必要になるようなコマンドを紹介していきます。
そのため、上記ページで紹介するコマンドに比べると多少難易度は上がりますが、特にプログラミングの環境構築時やプログラムの動作確認時に役立つものが多いですので、是非コマンドの存在や役割だけでも覚えていってください!
このページではコマンドは Mac のターミナルから実行することを前提として解説していきますので、ターミナルの使い方等をご存知ない方は、まずは下記ページを読んでみてください。
Contents
プロセス関連
まずはプロセス関連のコマンドを紹介していきます。
プロセスとは、コンピュータ(CPU)によって実行される処理のことです。
プログラムは「コンピュータに実行して欲しい処理」を記述したファイルですが、プログラム自体は単なるファイルなので、このままだと処理はコンピュータから実行されません。
コンピュータにプログラムに記述した処理を実行してもらうためには、そのプログラムから、コンピュータによって実行される処理である「プロセス」を生成する必要があります。
このプロセスを生成してやれば、あとはコンピュータがプロセスを実行してくれるようになります。

さらに、このプロセスはターミナル等からプログラムを実行することで生成することができます。これによりプログラムに記述された処理がプロセスとして生成されるので、コンピュータがプロセスを実行することでプログラムに記述された処理が実行されることになります。
そして、その処理が全て完了すれば、プロセスは終了します。
例えばカレントディレクトリに main.exe というプログラムが存在していたとしても、そのままの状態だと main.exe に記述されている処理は実行されません。単なるファイルです。
ですが、下記で main.exe を実行すれば、main.exe に記述された処理がプロセスとして生成されます。
./main.exe
そして、このプロセスがコンピュータによって実行され、main.exe の結果をユーザーが得ることができることになります。
こんな感じで、コンピュータによって実行される処理のことをプロセスと言います。
簡単に考えれば、プロセスとは実行中のプログラムとも言えます。
ただし、プログラムとプロセスは1対1の関係ではないので注意してください。例えば同じプログラムでも2回実行すればプロセスは2つ起動することになります。また、プログラムを1回実行しただけでも、プログラムの実行によって生成されるプロセスから別のプロセスが生成されるようなこともあります。

コンピュータ上には、あなたが手動でプログラムを実行して生成したプロセスだけではなく、コンピュータ起動時に自動的に生成されて常駐しているようなプロセスも存在します。
こういったプロセスの状態を表示したり、プロセスに対して何かしらの動作を行わせるためのコマンドなどが存在しますので、それらについて解説していきます。
ps:プロセスの情報を表示する

ps は起動中のプロセスの情報を表示するコマンドです。
書式
ps コマンドを “引数なし&オプションなし” で実行することで、”自身のユーザーが生成した” & “制御端末を持つ” プロセスの情報が表示されることになります。
$ ps PID TTY TIME CMD 519 ttys000 0:00.13 /bin/zsh --login 790 ttys001 0:00.99 /bin/zsh -l 1777 ttys002 0:01.30 -zsh 9175 ttys002 0:00.01 ./a.out 10103 ttys003 0:00.23 -zsh 10117 ttys003 0:00.01 less test.txt
1つの行が1つのプロセスの情報を表しています。
プロセスの情報として一番左側に表示されている PID が、プロセスを識別する ID となります。
使用例1
引数に PID を指定することで、その PID のプロセスの情報のみを表示することも可能です。
$ ps 9175 PID TT STAT TIME COMMAND 9175 s004 SN 0:00.01 ./a.out
使用例2
また、単に ps ではなく、オプションを付加して ps aux でプロセスの情報を表示する機会も多いです。
各オプションについては後述で解説しますが、aux オプションを付けることで、Mac 上で起動している全てのプロセスの情報の詳細を表示することができます。
$ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND daeu 448 10.0 0.5 5274016 22796 ?? S 日05AM 3:53.58 /System/Applicat _windowserver 142 8.3 1.2 7029880 50548 ?? Ss 日05AM 120:06.75 /System/Library/ root 132 4.4 0.1 4366868 4588 ?? Ss 日05AM 3:51.40 /usr/sbin/blueto daeu 428 2.0 1.9 5842512 79556 ?? Ss 日05AM 11:52.47 /System/Library/ 〜 略 〜
実際に実行して ps と ps aux の表示結果を確認すれば、表示されるプロセスの数(行数)の違いを確認することができると思います。例えば、今このページを表示するために使用しているウェブブラウザ(Google Chrome など)もプロセスとして表示されているはずです。
また列数も増え、より詳細な情報が表示されるようになったことも確認できると思います。
この aux オプションは利用する機会も多いので、ps コマンドとセットで覚えておくと良いと思います(aux は - を付けずにオプション指定する必要があるので注意してください)。
使用例3
ただ、ps aux では Mac 上で起動している全てのプロセスの情報が表示されるため、一気に大量の情報が表示されてしまって見にくいです。
そのため、ps aux は | (パイプ) と組み合わせて利用することも多いです。
例えば | grep 検索文字列 と一緒に組み合わせて利用すれば、検索文字列 がプロセスの情報に含まれる行のみが抽出されて表示されることになります。
例えば下記を実行すれば、プロセスの情報のいずれかに main.exe という文字列が含まれる行のみが抽出されて表示されるようになります。
$ ps aux | grep main.exe daeu 10493 0.0 0.0 4277624 732 s005 S+ 6:01PM 0:00.00 grep main.exe daeu 10489 0.0 0.0 4268284 696 s003 S+ 6:01PM 0:00.00 ./main.exe
使用例4
また、下記コマンドを実行して、ps aux の結果を more コマンドで少しずつスクロールしながら確認するようなことも可能です。
$ ps aux | more
上記の2つの例で使用している | (パイプ) については下記ページで解説していますので、ご存知ない方は是非読んでみてください。コマンドを利用するのであればパイプは使えるようになっておいた方が良いです。
a オプション
よく使うオプションは前述の通り aux で、これを指定することで Mac 上で起動中のプロセス全ての情報を表示することができます。
aux オプションの a オプションに関しては「自身のユーザー以外」が生成したプロセスも含めて表示するためのオプションになります。
ps コマンド単体で表示されるのは 「自身のユーザー」が生成したプロセスのみですので、a オプションを指定することで全ユーザーが生成したプロセスが表示されることになります。
自身のユーザーが生成したプロセスには、あなた自身がコマンド等で手動で生成したプロセスだけでなく、Mac 起動中に自身のユーザーから自動的に生成されたプロセスも含まれます
x オプション
順番前後しますが、x オプションに関しては、「制御端末を持たない」プロセスも含めて表示するためのオプションになります。
ps コマンド単体で表示されるのは 「制御端末を持つ」プロセスのみですので、x オプションを指定することで、自身のユーザーが生成したプロセス全てが表示されることになります。
「制御端末を持つ」の意味合いは難しくて私も上手く説明できないのですが、まずは自身のユーザーが生成したプロセス全てを表示する際には x オプションが必要であることだけ覚えておけば良いと思います。
また、前述で紹介した a オプションと組み合わせて ax を指定すれば、全ユーザーが生成した全プロセス、すなわち Mac 上で起動中の全プロセスの情報が表示されることになります。
u オプション
u オプションに関しては、より詳細なプロセスの情報を表示するためのオプションになります。
このオプションを指定することで、プロセスを生成したユーザー名(USER の列)やプロセスの CPU 使用率(%cpu の列)等を含めてプロセスの情報が表示されるようになります。
l オプション
l オプションも、u オプション同様に、より詳細なプロセスの情報を表示するためのオプションになります。
このオプションを指定することで、親プロセスの ID(PPID の列)やプロセスの優先度(NI の列)等を含めてプロセスの情報が表示されるようになります。
u オプションとは表示される情報が異なるため、確認したい情報に合わせて使い分けるのが良いと思います。
スポンサーリンク
kill:プロセスにシグナルを送る
コマンドの中には「プロセスに対して操作を行う」ものも存在します。
その1つがここで紹介する kill であり、この kill はプロセスに対してシグナルを送信するコマンドになります。
kill コマンドでプロセスにシグナルを送信することで、受信先のプロセスに「何かしらの動作」を行わせることができます。

シグナルとは信号のことで、Mac や Linux では様々なシグナルが用意されており、シグナル毎に受信先のプロセスが行うデフォルトの動作が設定されています。
例えば SIGTERM というシグナルの場合、受信先のプロセスのデフォルト設定の動作は「終了」になっています。なので、kill コマンドでプロセスに SIGTERM を送信すれば、基本的にはそのプロセスを終了させることができます。
ただ、シグナルを受け取ったプロセスが必ずデフォルト設定の動作をするとは限らないので注意してください。シグナルを受け取った時の動作は、プログラミングなどによって変更することも可能です。
書式
kill コマンドは引数に プロセスID を指定して実行します。これにより、その プロセスID のプロセスにシグナルを送信することができます。
$ kill プロセスID
オプションを指定せずに kill コマンドを実行した場合、SIGTERM という名前のシグナルが プロセスID のプロセスに送信されることになります。
前述の通り、SIGTERM のシグナルを受け取ったプロセスのデフォルト設定での動作は「終了」です。そのため、上記コマンドを実行することでプロセスを終了させることができます。ただし、SIGTERM を受け取ったプロセスの全てが終了動作を行うとは限らないので注意してください。プロセスによっては SIGTERM を受け取っても終了しないものがあります。
強制的に終了させたい場合は、後述するオプション指定によって SIGKILL を送信する必要があります。
使用例
kill コマンドを利用する場合、シグナルの送信先となるプロセスを指定するために、まずはそのプロセスの プロセスID を調べる必要があります。
この プロセスID を調べるための1つの手段が先程紹介した ps コマンドになります。
例えば ps コマンドの表示結果が下記であり、
$ ps PID TTY TIME CMD 519 ttys000 0:00.13 /bin/zsh --login 790 ttys001 0:00.99 /bin/zsh -l 10103 ttys005 0:00.53 -zsh 11062 ttys005 0:04.55 ./main.exe
実行中の main.exe のプロセスにシグナルを送信したいのであれば、そのプロセスの行の PID の列に記載されている 11062 を指定して下記のように kill コマンドを実行します。
$ kill 11062
これにより、シグナル SIGTERM が main.exe のプロセスに送信され、送信先のプロセスの SIGTERM を受け取った時の動作が変更されていなければ、このシグナル受信により送信先のプロセスが終了することになります(権限の関係で実行できない場合もあるので注意)。
zsh: terminated ./main.exe
-s オプション
前述の通り、Mac では多くのシグナルが用意されており、-s オプションを指定することで送信するシグナルを指定することができます。
-s オプションには、例えば下記のような シグナル名 を指定することが可能です(括弧内はシグナル受信時のプロセスの動作のデフォルト設定となります)。
SIGTERM(終了)SIGKILL(強制終了)SIGSTOP(停止)SINGCONT(再開)
シグナル名 のプレフィックス SIG は省略可能です。
また、送信するシグナルを指定しなかった場合は SIGTERM が送信されることになります。SIGTERM を受け取ったプロセスの動作は「終了」となりますので、kill をプロセスを終了するコマンドと捉えている方も多いと思います。
例えば下記のように kill コマンドを実行すれば、プロセスID が 11062 のプロセスにシグナル SIGSTOP を送信することができます。これによりプロセスを停止することができます。
$ kill -s SIGSTOP 11062
さらに、SIGSTOP を送信して停止させたプロセスに対し、下記のように kill コマンドを実行すれば、今度はそのプロセスが再開することになります(前述の通り、-s オプションの場合、シグナル名 のプレフィックス SIG は省略可能です)。
$ kill -s CONT 11062
SIGKILL に関してはおそらくデフォルト設定から動作を変更することができないため、SIGTERM で終了できないプロセスでも SIGKILL を送信することで終了させられる可能性が高いです。
また、Mac に用意されているシグナルに関しては、man signal で調べることができますので、必要に応じて man コマンドから確認してみてください。
$ man signal
-シグナル名 or -シグナル番号
ここまで -s オプションで送信するシグナルを指定する例を紹介してきましたが、実は -s を指定することなく、kill の後ろに -シグナル名 を指定して送信するシグナルを指定することも可能です。
例えば下記を実行すれば、プロセスID が 11062 のプロセスにシグナル SIGKILL を送信することができます。
$ kill -SIGKILL 11062
また、各シグナルには番号が割り振られており、-シグナル番号 のように シグナル名 ではなく番号で送信するシグナルを指定することもできます。
例えばシグナル SIGKILL のシグナル番号は 9 なので、下記を実行することでも プロセスID が 11062 のプロセスにシグナル SIGKILL を送信することができます。
$ kill -9 11062
シグナル名とシグナル番号の対応についても、前述で紹介した man コマンドで調べることができますので、詳しく知りたい方は man signal で調べてみてください。
lsof:ファイル等を使用中のプロセスを表示する
kill コマンドはシグナルを送信することでプロセスを終了させることができる、非常に便利なコマンドです。
ただし、kill コマンドでは送信先のプロセスの プロセスID をあらかじめ調べておく必要があります。
この プロセスID を調べるのに便利なコマンドの1つが lsof コマンドになります。
このコマンドを利用することで、特定のファイルを開いているプロセスや、特定のポートを使用しているプロセスの プロセスID を調べることができます。

例えばネットワークプログラミングをしていてプログラムに特定のポートを使用させたいような場合、実行前にそのポートを使用しているプロセスをあらかじめ終了させておく必要があります。
さらに、そのポートを使用しているプロセスを終了させるためには、そのプロセスの プロセスID をあらかじめ調べておく必要があります。
こんな時に便利なのが lsof コマンドで、これを実行すれば特定のポートを使用しているプロセスの プロセスID を調べることができ、さらに、その プロセスID を利用して kill コマンドを実行することで、そのプロセスを終了させることができます。
この lsof コマンドに関しては下記ページで解説していますので、詳しくはこちらをご参照いただければと思います。
ネットワーク関連
続いて、ネットワーク関連でよく利用するコマンドを紹介していきます。
特に、複数の PC 上のプログラムがネットワークを介して連携動作するようなシステムの「動作確認環境」を構築する際には知っておいた方が良いコマンドになります。
ここから紹介するコマンドを利用して、複数の PC やサーバーがそもそも通信可能な状態なのかどうかを調べることができます。
スポンサーリンク
ifconfig:ネットワーク IF の状態を表示する

ifconfig は、PC のネットワーク IF の状態を表示するコマンドになります。
ネットワーク IF とは、PC が他の PC やサーバーと直接通信を行う通信口のことです。
他の PC やサーバーと通信を行うためには、ネットワーク IF が起動し、さらにこの IF に IP アドレスが割り振られている必要があります。
起動していなかったり、IP アドレスが割り振られていないような場合は、そのネットワーク IF を利用して通信を行うことができません。他の PC やサーバーと通信を行う上では、このネットワーク IF が起動し、さらにネットワーク IF に IP アドレスが割り振られていることが大前提となります。
この大前提がまずクリアできていないと、他の PC やサーバーとは通信できません。
ifconfig は、このネットワーク IF の状態の表示や、さらにはネットワーク IF の起動などの設定を行うコマンドになります。
他の PC 等との通信が上手くできない場合にネットワーク IF の状態を確認したい場合や、割り振られている IP アドレスを調べたい時などに使用機会の多いコマンドになります。
ちなみに Linux の場合は ifconfig の代わりに ip コマンドを利用することが推奨されているようです
書式
ifconfig コマンドは下記のように引数なしに実行することもできますし、
$ ifconfig
下記のように引数に IF名 を指定して実行することもできます。
$ ifconfig IF名
さらには、IF名 に 設定 を引数で指定することで、指定した IF に対して起動や停止、さらには IP アドレスを割り振るなどの設定を行うことができます。
$ ifconfig IF名 設定
使用例1
前述の通り、ifconfig コマンドは引数なしで実行することができ、この場合は PC 上の全てのネットワーク IF の状態を表示することができます。
$ ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP> inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201<PERFORMNUD,DAD> en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=400 ether 00:11:22:33:44:55 inet6 fe80::6666:7777:8888:999%en0 prefixlen 64 secured scopeid 0x4 inet 192.168.2.104 netmask 0xffffff00 broadcast 192.168.2.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active
各情報が何を示しているかを詳しく知りたい方は別途 man ifconfig で調べてみていただければと思いますが、特に重要なのは上記の太字で示した情報になります。
上記における lo0 と en0 は IF 名となります。さらに、UP はその IF が起動していること、RUNNING はデータの通信が可能であることを示します。UP が表示されていない場合は、後述の手順で IF を起動する必要がありますし、また UP が表示されているのに RUNNING が表示されていない場合はドライバ等の不具合が予想されます。
また、inet の後ろ側に表示されているのは IF に割り振られた IP アドレスになります。これも表示されていなければ、IF に IP アドレスを割り振る必要があります(inet6 の後ろ側に表示されているのは IF に割り振られた IPv6 の IP アドレスになります)。
こんな感じで、ifconfig を実行することでネットワーク IF の情報を確認することができます。
使用する IF が通信できるかどうかを調べる際には、まず ifconfig で出力される IF の情報に UP・RUNNING・inet が表示されていることを確認するのが基本になるかと思います。
使用例2
また、単に ifconfig を実行すると全てのネットワーク IF の情報が表示されますが、引数で IF名 を指定することで特定の IF の情報のみを表示することも可能です。
$ ifconfig en0
使用例3
さらに、IF名 の後ろに設定を指示するオプションを指定することで、IF名 の IF に対して設定を行うことができます。下記のように up を指定した場合、en0 の起動を行うことができます。
$ ifconfig en0 up
ただし、IF の設定はスーパーユーザーでないと行えないので注意してください。このため、単に上記のようにコマンドを実行するのではなく、実際には次のように sudo を付けてコマンドを実行する必要があります。
$ sudo ifconfig en0 up
ping:端末同士の接続状態を確認する

ifconfig は、自身の PC のネットワーク IF が正常に動作しているかどうかを確認する際に利用するコマンドになります(もしくは IF の設定を行うコマンド)。
ただし、ネットワーク IF が正常に動作していたとしても相手の PC やサーバーと通信ができるとは限りません。ここで紹介する ping コマンドは、自身の PC と相手の PC(サーバーなども含む)が通信可能であるかどうかを調べる際に有効なコマンドになります。
ping コマンドでは、実際に相手の PC にパケットというデータを送信するコマンドになります。

基本的には、このパケットを受信した PC は応答としてパケットを送信します。

その応答のパケットを ping コマンドを実行した PC が受信することができれば、2つの PC は通信できる状態であると判断することができます。
あくまでも受信するのは応答なので、そもそも相手の PC にパケットが送信できていなければ、応答を受け取ることはできません。なので、応答を受信できなければ、何らかの理由で2つの PC は通信できない状態である可能性が高いです。

また、ping からのパケットを受信したからといって必ず PC が応答を送信するわけではないようなので注意してください。
書式
ping コマンドは、下記のように引数に IPアドレス を指定して実行します。ping コマンドを終了する際は control + c を同時押ししてください。
$ ping IPアドレス
使用例1
例えば、下記のように引数に 192.168.2.103 を指定した場合、IP アドレス 192.168.2.103 が割り振られたネットワーク IF を持つ PC に対してパケットが送信されます。
$ ping 192.168.2.103
パケット送信後、下記のように送信先からパケット(データ)を受信できた場合、自身の PC とパケット送信先の PC(送信先の IP アドレス 192.168.2.103 が割り振られたネットワーク IF を持つ PC)とは「通信可能である」と判断することができます。
$ ping 192.168.2.103 PING 192.168.2.103 (192.168.2.103): 56 data bytes 64 bytes from 192.168.2.103: icmp_seq=0 ttl=255 time=1.893 ms 64 bytes from 192.168.2.103: icmp_seq=1 ttl=255 time=1.921 ms 64 bytes from 192.168.2.103: icmp_seq=2 ttl=255 time=1.929 ms
それに対し、下記のようにタイムアウトが発生するなどして送信先からパケットを受信できなかった場合、自身の PC と送信先の PC とは「通信不可である」と判断することができます。
$ ping 192.168.2.103 PING 192.168.2.103 (192.168.2.103): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3
もちろん、ping コマンドの実行結果から通信不可である原因まで調べることはできませんが、2つの PC 上で動作するソフトウェアで上手く通信ができない場合、ifconfig の結果と照らし合わせて考えてみれば、下記のどのあたりに問題があるかのヒントにはなると思います。
- ネットワーク IF
- 2つの PC の通信経路
- 2つの PC 上で動作しているソフトウェア(クライアントソフトウェアやサーバーソフトウェア)
使用例2
また、IP アドレスではなくホスト名を指定して ping コマンドを実行することも可能です。
$ ping airmac-time-capsule PING airmac-time-capsule (192.168.2.105): 56 data bytes 64 bytes from 192.168.2.105: icmp_seq=0 ttl=255 time=0.982 ms 64 bytes from 192.168.2.105: icmp_seq=1 ttl=255 time=2.083 ms
同様に、ドメイン名を指定して、ウェブページが公開されているウェブサーバーに対して ping を実行するようなことも可能です。
使用例3
また、引数にブロードキャストアドレスというアドレスを指定して ping コマンドを実行することで、同一ネットワーク内の全ての PC(端末)にパケットを送信することもできます。
$ ping 192.168.2.255
このように同一ネットワーク内の全ての端末にパケットを送信することをブロードキャストと呼びます。同一ネットワーク内の存在する端末を調べるのに便利ですが、ブロードキャストに対して応答しないように設定されている端末も存在する可能性があるので注意してください。
他のコマンドとの組み合わせ
また、コマンド単体ではあまり利用価値はないものの、他のコマンドと併用することで絶大な効果を発揮するコマンドも存在します。
ここからは、主に他のコマンドと併用することで効果を発揮するコマンドを紹介していきます。
スポンサーリンク
xargs:ファイル等からコマンド引数を生成する

xargs は、標準入力から入力された文字列を他のコマンドの引数に変換するコマンドになります。
書式
xargs は、下記のように引数に他のコマンドを指定して実行します。
$ xargs コマンド
これにより、xargs コマンドに対して標準入力から入力された文字列を引数に変換し、それが コマンド の引数にセットされた状態で コマンド が実行されることになります。
使用例1
さらに、この xargs はリダイレクトやパイプと併用することが多く、これによりコマンド操作での作業効率を高めることができます。
リダイレクトやパイプに関しては下記ページで解説していますので、詳しく知りたい方はコチラを参照していただければと思います。
例えば、カレントディレクトリに下記のようにファイルパスを複数記載したテキストファイルを用意し(ファイル名を path.txt とします)、
./Documents/text1.txt
./Documents/text2.txt
./Documents/text3.txt
さらに下記のように xargs コマンドを実行した場合、テキストファイルに記載しているファイルパスのファイル全てに対して rm コマンドが実行されることになります。
$ xargs rm <path.txt
上記コマンドでテキストファイルに記載したファイルパス全てに対して rm が実行される理由について解説しておくと、まず <path.txt の部分がリダイレクト命令で、これにより path.txt の中身が xargs の標準入力に入力されます。

そして、xargs の引数に指定したコマンド(上記の場合は rm)が実行されることになります。この時に、その実行されるコマンドの引数として、xargs が path.txt の中身を引数の形式に変換したものが指定されることになります。
すなわち、上記のコマンドにより、xargs から次のコマンドが実行されることになり、path.txt に記載したパスを引数としてrm が実行されることになります。
rm ./Documents/text1.txt ./Documents/text2.txt ./Documents/text3.txt
使用例2
また、xargs は複数のコマンドを連携して動作させるような場合にもよく利用されます。
例えば下記のようにコマンドを実行することで、カレントディレクトリ以下にある拡張子が .txt のファイル全てに対して grep HELLO コマンドが実行されることになります。
$ find . -name "*.txt" | xargs grep HELLO
上記ではパイプ | を利用しており、これにより find コマンドの実行結果(つまりカレントディレクトリ以下にある拡張子が .txt のファイルのパス)が xargs の標準入力に入力されることになります。
さらに、xargs で入力されたファイルパスが引数の形式に変換され、それを grep の引数に指定して grep が実行されることになります。

これにより、カレントディレクトリ以下にある拡張子が .txt の全ファイルの中から HELLO という文字列を含むファイルを探し出すことができます。
1つ1つパスを指定しながら grepコマンドを実行しなくても、一回のコマンド実行で複数のファイルに対して grep コマンドが実行できるので、コマンド入力の手間を大きく省くことができます。
こんな感じで、xargs コマンドを利用することでファイルの中身やコマンドの実行結果を他のコマンドの引数として利用することができ、これによりコマンド操作時の作業効率を向上させることができます。
また、find コマンドの結果を別のコマンドの引数に指定する際には -exec オプションも便利です。xargs と -exec オプションとの違いについては下記ページで解説していますので、詳しくはこちらをご参照ください。
tee:画面への表示とファイル出力を同時に行う
tee は標準入力からの入力を標準出力とファイルの両方に出力するコマンドです。
標準出力はデフォルトでは画面に設定されているので、標準入力からの入力を画面とファイルの両方に出力するコマンドと考えて良いです。

基本的には、コマンドからの標準出力への出力は画面 or ファイルなどのように、一箇所にしか出力することができません。
ですが、この tee コマンドを利用すれば、コマンドからの出力を画面とファイルの両方に出力することができるようになり、画面でも出力を確認しつつ、その出力をファイルにも保存するようなことができるようになります。
書式
tee コマンドは、下記のように引数に ファイルパス を指定して実行します。
これにより、tee コマンドに標準入力から入力された文字列等が ファイルパス のファイルと標準出力に出力されるようになります。
$ tee ファイルパス
ただし、xargs コマンド同様に、tee コマンドは単体で使用するのではなく、他のコマンドと併用して使用します。この併用を行う際にパイプ | を利用します。
$ コマンド | tee ファイルパス
パイプを利用することで、コマンドの標準出力への出力が tee コマンドの標準入力に入力されるようになります。そして、tee コマンドがその入力を標準出力と ファイルパス のファイルの両方に出力されるようになります。
使用例
例えば下記のようにコマンドを実行すれば、カレントディレクトリ以下にある拡張子が .txt のファイルのファイルパスを画面に表示しつつ、さらに result.txt ファイルにも出力して保存することができます。
find . -name "*.txt" | tee result.txt
time:プログラムの処理時間の計測を行う

time はプログラムや別のコマンドの処理時間の計測を行うコマンドになります。
書式
time の引数として コマンド を指定すれば、その コマンド の実行開始から実行終了までの経過時間や CPU 時間等を計測して表示することができます。
$ time コマンド
使用例1
例えば下記を実行すれば find コマンドが実行され、find コマンドが終了した際に find コマンドの実行開始から実行終了までの経過時間や CPU 時間等が表示されるようになります。
$ time find . -name "*.txt" 〜 findコマンドの結果 〜 find . -name "*.txt" 0.55s user 7.44s system 58% cpu 13.730 total
一番下の行が time コマンドでの計測結果であり、それぞれの項目は下記のような意味合いとなります。
0.55s user:findコマンド実行中の “ユーザー CPU 時間”7.44s system:findコマンド実行中の “システム CPU 時間”58% cpu:findコマンド実行中の “CPU 使用率”13.730 total:findコマンド開始から終了までの “経過時間”
経過時間が一番直感的に分かりやすくて、要はコマンド実行するためにエンターキーを押してからコマンドが終了するまでに実際に経過した時間になります。
また、コマンドを処理するのは CPU というハードウェアになります。例えば find コマンドを実行すれば、CPU が find のプログラムに従ってファイルの検索を行います
CPU 使用率は、経過時間のうち、CPU が time の引数に指定した コマンド のために処理を実行していた時間の割合を示すものになります。
CPU はいろんなプログラム(プロセス)を処理する必要がありますので、コマンド実行中に他のプログラムを実行することもありますし、他のハードウェアの処理が完了するのを待っていたりすることもあります。
そういった時間を経過時間から差し引いたものが CPU 時間であり、経過時間に対する CPU 時間の割合が CPU 使用率となります。
さらに、その CPU 時間の内訳が「システム CPU 時間(カーネル空間で処理していた時間)」と「ユーザー CPU 時間(ユーザー空間で処理していた時間)」になります(正直ここの内訳は私も自信ない…)。
使用例2
また、time コマンドの引数にプログラムのパスを指定してプログラムの開始から終了までの時間を計測することも可能です。
$ time ./main.exe
$ time python main.py
ただし、計測できる経過時間はプログラム実行開始から終了までの時間であり、プログラム起動の時間等も含まれる点に注意してください。
特定の処理のみの経過時間や CPU 時間を計測したいのであれば、プログラム内にコードとして時間を計測する処理を記述してあげた方が良いと思います。
スポンサーリンク
コマンド関連
最後にコマンド関連のコマンドを紹介していきます。
which:コマンドへのファイルパスを調べる

which コマンドは、何かしらのコマンドを実行した際に「実際に実行されるプログラムのファイルパス」を表示するコマンドになります。
まず前提として、コマンドの実行とは要はプログラムの実行になります。コマンドを実行することで、Mac のいずれかのディレクトリに存在するプログラムのファイルが実行されることになります。もっと具体的に言えば、PATH に設定されたディレクトリに存在するプログラムのファイルが実行されることになります。
では、具体的にどのコマンドを実行すれば、どのプログラムのファイルが実行されるのか?
これを調べるコマンドが which になります。
ちなみに、PATH については下記ページで解説していますので、必要に応じて参照していただければと思います。
書式
which の引数として コマンド を指定すれば、その コマンド により実際に実行されるプログラムのファイルパスを表示することができます。
$ which コマンド
使用例
例えば下記を実行すれば、python コマンドにより実際に実行されるプログラムのファイルパスが表示されます。
$ which python /usr/bin/python
この結果から、python コマンドを実行した際には /usr/bin の下にある python というプログラムファイルが実行されていることを確認することができます。
PATH が上手く設定されているかどうかや、複数ある同種のプログラム(同じファイル名のプログラム)のうち、意図したプログラムが実行されているかどうかを確認したい場合に便利なコマンドになります。
-a オプション
-a オプションを指定することで、引数に指定したコマンドに対して PATH が通っているファイルのパス全てを列挙することができます。
例えば which -a python3 を実行して下記のように結果が表示されたのであれば、
$ which -a python3 /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /usr/local/bin/python3 /usr/bin/python3
PATH に設定されているフォルダの中に python3 という名前のファイルが4つ存在していることを確認することができます。
実際にコマンドにより実行されるのは一番上側に表示されるパスのプログラムとなります。なので、一番上以外のパスのプログラムを実行したいような場合は、単にコマンド名を指定するのではなくパスを指定して実行する必要があります。
例えば上記の例において、/usr/bin/ のフォルダの下にある python3 を実行したいのであれば、/usr/bin/python3 といった感じでパスを指定してコマンドを実行する必要があります。
source:ファイルに記述されたコマンドを実行する

source はファイル内に記述されているコマンドを実行するコマンドになります。
書式
source の引数として ファイルパス を指定すれば、その ファイルパス のファイルに記述されたコマンドが実行されることになります。
$ source ファイルパス
使用例1
例えば下記のようにコマンドが複数記述されたファイルを用意し(このファイルを commands.txt とします)、
echo "test"
find . -name "*.txt"
touch "empty.txt"
ps aux
下記のように source コマンドを実行すれば、commands.txt に記述されている echo コマンド・find コマンド・touch コマンド・ps コマンドが実行されることになります。
$ source commands.txt
よく利用する一連の複数のコマンドをファイルに記述しておけば、source コマンド1つでそれらを実行できて便利だと思います。
使用例2
あとは、PATH の設定時にも source コマンドをよく使用します。
Mac での PATH の設定は、.zshrc というファイルに export コマンドを記述することで行われます。これによりターミナル(シェル)の起動時に .zshrc に記述された export コマンドが実行されて PATH の設定が反映されることになります。
逆にいうと、.zshrc に export コマンドを記述しただけだと PATH の設定は反映されません(ファイルに export コマンドを記述するだけでは export コマンドは実際には実行されないので)。
このような、PATH の設定を直ちに反映したいような場合に、export コマンドを記述した .zshrc に対して source コマンドを実行することがあります。
$ source .zshrc
これにより、.zshrc に記述されたコマンドが実行されて PATH の設定が直ちに反映されることになります。
スポンサーリンク
まとめ
このページでは、特にプログラマーの方やプログラミング等の環境構築者がよく利用する Mac のコマンドを紹介しました!
もちろんどういったプログラミングや環境構築を行うかにもよるのですが、私は ps・kill・ifconfig・ping・xargs あたりは非常に利用する機会が多いです。
また、今回紹介したコマンドをすぐ利用する機会は無いとしても、コマンド名とコマンドの役割だけでも覚えておいた方が良いと思います。プログラミングなどを行うのであれば今後利用する可能性は高いですし、コマンド名を覚えておけば、使い方の詳細は man コマンドですぐに調べることができます。
また、オプションもいくつか紹介していますが、これらはほんの一部であって他のオプションも多く存在します。コマンドの動作をより細かに制御をしたいような場合も、是非 man コマンドで他のオプションの存在やその意味合いを調べてみてください。
今回紹介したコマンドは Mac に標準で搭載されているコマンドばかりになりますが、今度は Mac に標準で搭載されていないものの、使えるようにした方が良いコマンドも紹介していきたいと思います!

