【Mac】プログラマー向けターミナルコマンド集

プログラマー向けmacのコマンドの紹介ページアイキャッチ

このページでは、特にプログラマーの方に是非覚えておいてほしい「Mac のコマンド」を紹介していきます。

下記ページでも Mac のコマンドを紹介していますが、PC 初心者の方でも馴染みのある「ファイル」や「フォルダ(ディレクトリ)」を扱う、どちらかというと初心者の方向けのコマンドを紹介しました。

Macのターミナルで良く使うコマンド集紹介ページのアイキャッチMacのターミナルでよく使うコマンド集(初心者向け)

それに対し、このページではプロセスやネットワークなどの前提知識が必要になるようなコマンドを紹介していきます。

そのため、上記ページで紹介するコマンドに比べると多少難易度は上がりますが、特にプログラミングの環境構築時やプログラムの動作確認時に役立つものが多いですので、是非コマンドの存在や役割だけでも覚えていってください!

このページではコマンドは Mac のターミナルから実行することを前提として解説していきますので、ターミナルの使い方等をご存知ない方は、まずは下記ページを読んでみてください。

macのターミナルアプリの使い方の解説ページアイキャッチMacでのターミナルアプリの使い方

プロセス関連

まずはプロセス関連のコマンドを紹介していきます。

プロセスとは、コンピュータ(CPU)によって実行される処理のことです。

プログラムは「コンピュータに実行して欲しい処理」を記述したファイルですが、プログラム自体は単なるファイルなので、このままだと処理はコンピュータから実行されません。

コンピュータにプログラムに記述した処理を実行してもらうためには、そのプログラムから、コンピュータによって実行される処理である「プロセス」を生成する必要があります。

このプロセスを生成してやれば、あとはコンピュータがプロセスを実行してくれるようになります。

プロセスの説明図

さらに、このプロセスはターミナル等からプログラムを実行することで生成することができます。これによりプログラムに記述された処理がプロセスとして生成されるので、コンピュータがプロセスを実行することでプログラムに記述された処理が実行されることになります。

そして、その処理が全て完了すれば、プロセスは終了します。

例えばカレントディレクトリに main.exe というプログラムが存在していたとしても、そのままの状態だと main.exe に記述されている処理は実行されません。単なるファイルです。

ですが、下記で main.exe を実行すれば、main.exe に記述された処理がプロセスとして生成されます。

./main.exe

そして、このプロセスがコンピュータによって実行され、main.exe の結果をユーザーが得ることができることになります。

こんな感じで、コンピュータによって実行される処理のことをプロセスと言います。

簡単に考えれば、プロセスとは実行中のプログラムとも言えます。

ただし、プログラムとプロセスは1対1の関係ではないので注意してください。例えば同じプログラムでも2回実行すればプロセスは2つ起動することになります。また、プログラムを1回実行しただけでも、プログラムの実行によって生成されるプロセスから別のプロセスが生成されるようなこともあります。

マルチプロセスの説明図

コンピュータ上には、あなたが手動でプログラムを実行して生成したプロセスだけではなく、コンピュータ起動時に自動的に生成されて常駐しているようなプロセスも存在します。

こういったプロセスの状態を表示したり、プロセスに対して何かしらの動作を行わせるためのコマンドなどが存在しますので、それらについて解説していきます。

ps:プロセスの情報を表示する

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/
〜 略 〜

実際に実行して psps 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つの例で使用している | (パイプ) については下記ページで解説していますので、ご存知ない方は是非読んでみてください。コマンドを利用するのであればパイプは使えるようになっておいた方が良いです。

パイプの解説ページアイキャッチパイプ | について解説( | と | xargs の違いも理解できる!)

a オプション

よく使うオプションは前述の通り aux で、これを指定することで Mac 上で起動中のプロセス全ての情報を表示することができます。

aux オプションの a オプションに関しては「自身のユーザー以外」が生成したプロセスも含めて表示するためのオプションになります。

ps コマンド単体で表示されるのは 「自身のユーザー」が生成したプロセスのみですので、a オプションを指定することで全ユーザーが生成したプロセスが表示されることになります。

MEMO

自身のユーザーが生成したプロセスには、あなた自身がコマンド等で手動で生成したプロセスだけでなく、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 コマンドでプロセスにシグナルを送信することで、受信先のプロセスに「何かしらの動作」を行わせることができます。

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 コマンドを実行すれば、プロセスID11062 のプロセスにシグナル 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 の後ろに -シグナル名 を指定して送信するシグナルを指定することも可能です。

例えば下記を実行すれば、プロセスID11062 のプロセスにシグナル SIGKILL を送信することができます。

$ kill -SIGKILL 11062

また、各シグナルには番号が割り振られており、-シグナル番号 のように シグナル名 ではなく番号で送信するシグナルを指定することもできます。

例えばシグナル SIGKILL のシグナル番号は 9 なので、下記を実行することでも プロセスID11062 のプロセスにシグナル SIGKILL を送信することができます。

$ kill -9 11062

シグナル名とシグナル番号の対応についても、前述で紹介した man コマンドで調べることができますので、詳しく知りたい方は man signal で調べてみてください。

lsof:ファイル等を使用中のプロセスを表示する

kill コマンドはシグナルを送信することでプロセスを終了させることができる、非常に便利なコマンドです。

ただし、kill コマンドでは送信先のプロセスの プロセスID をあらかじめ調べておく必要があります。

この プロセスID を調べるのに便利なコマンドの1つが lsof コマンドになります。

このコマンドを利用することで、特定のファイルを開いているプロセスや、特定のポートを使用しているプロセスの プロセスID を調べることができます。

lsofコマンドの説明図

例えばネットワークプログラミングをしていてプログラムに特定のポートを使用させたいような場合、実行前にそのポートを使用しているプロセスをあらかじめ終了させておく必要があります。

さらに、そのポートを使用しているプロセスを終了させるためには、そのプロセスの プロセスID をあらかじめ調べておく必要があります。

こんな時に便利なのが lsof コマンドで、これを実行すれば特定のポートを使用しているプロセスの プロセスID を調べることができ、さらに、その プロセスID を利用して kill コマンドを実行することで、そのプロセスを終了させることができます。

この lsof コマンドに関しては下記ページで解説していますので、詳しくはこちらをご参照いただければと思います。

lsofコマンドの紹介ページアイキャッチ【Mac】lsof コマンドでファイルやポートを使用しているプロセスを特定する

ネットワーク関連

続いて、ネットワーク関連でよく利用するコマンドを紹介していきます。

特に、複数の PC 上のプログラムがネットワークを介して連携動作するようなシステムの「動作確認環境」を構築する際には知っておいた方が良いコマンドになります。

ここから紹介するコマンドを利用して、複数の PC やサーバーがそもそも通信可能な状態なのかどうかを調べることができます。

スポンサーリンク

ifconfig:ネットワーク IF の状態を表示する

ifconfigコマンドの説明図

ifconfig は、PC のネットワーク IF の状態を表示するコマンドになります。

ネットワーク IF とは、PC が他の PC やサーバーと直接通信を行う通信口のことです。

他の PC やサーバーと通信を行うためには、ネットワーク IF が起動し、さらにこの IF に IP アドレスが割り振られている必要があります。

起動していなかったり、IP アドレスが割り振られていないような場合は、そのネットワーク IF を利用して通信を行うことができません。他の PC やサーバーと通信を行う上では、このネットワーク IF が起動し、さらにネットワーク IF に IP アドレスが割り振られていることが大前提となります。

この大前提がまずクリアできていないと、他の PC やサーバーとは通信できません。

ifconfig は、このネットワーク IF の状態の表示や、さらにはネットワーク IF の起動などの設定を行うコマンドになります。

他の PC 等との通信が上手くできない場合にネットワーク IF の状態を確認したい場合や、割り振られている IP アドレスを調べたい時などに使用機会の多いコマンドになります。

MEMO

ちなみに 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 で調べてみていただければと思いますが、特に重要なのは上記の太字で示した情報になります。

上記における lo0en0 は IF 名となります。さらに、UP はその IF が起動していること、RUNNING はデータの通信が可能であることを示します。UP が表示されていない場合は、後述の手順で IF を起動する必要がありますし、また UP が表示されているのに RUNNING が表示されていない場合はドライバ等の不具合が予想されます。

また、inet の後ろ側に表示されているのは IF に割り振られた IP アドレスになります。これも表示されていなければ、IF に IP アドレスを割り振る必要があります(inet6 の後ろ側に表示されているのは IF に割り振られた IPv6 の IP アドレスになります)。

こんな感じで、ifconfig を実行することでネットワーク IF の情報を確認することができます。

使用する IF が通信できるかどうかを調べる際には、まず ifconfig で出力される IF の情報に UPRUNNINGinet が表示されていることを確認するのが基本になるかと思います。

使用例2

また、単に ifconfig を実行すると全てのネットワーク IF の情報が表示されますが、引数で IF名 を指定することで特定の IF の情報のみを表示することも可能です。

$ ifconfig en0

使用例3

さらに、IF名 の後ろに設定を指示するオプションを指定することで、IF名 の IF に対して設定を行うことができます。下記のように up を指定した場合、en0 の起動を行うことができます。

$ ifconfig en0 up

ただし、IF の設定はスーパーユーザーでないと行えないので注意してください。このため、単に上記のようにコマンドを実行するのではなく、実際には次のように sudo を付けてコマンドを実行する必要があります。

$ sudo ifconfig en0 up

ping:端末同士の接続状態を確認する

pingコマンドの説明図

ifconfig は、自身の PC のネットワーク IF が正常に動作しているかどうかを確認する際に利用するコマンドになります(もしくは IF の設定を行うコマンド)。

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

ping コマンドでは、実際に相手の PC にパケットというデータを送信するコマンドになります。

相手のPCやサーバーにパケットを送信する様子

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

相手のPCやサーバーに応答を送信する様子

その応答のパケットを ping コマンドを実行した PC が受信することができれば、2つの PC は通信できる状態であると判断することができます。

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

pingの応答が返ってこない様子

また、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 コマンド

これにより、xargs コマンドに対して標準入力から入力された文字列を引数に変換し、それが コマンド の引数にセットされた状態で コマンド が実行されることになります。

使用例1

さらに、この xargs はリダイレクトやパイプと併用することが多く、これによりコマンド操作での作業効率を高めることができます。

リダイレクトやパイプに関しては下記ページで解説していますので、詳しく知りたい方はコチラを参照していただければと思います。

リダイレクトの解説ページアイキャッチコマンドのリダイレクトについて解説(標準入力や標準出力の接続先を変更) パイプの解説ページアイキャッチパイプ | について解説( | と | xargs の違いも理解できる!)

例えば、カレントディレクトリに下記のようにファイルパスを複数記載したテキストファイルを用意し(ファイル名を path.txt とします)、

path.txt
./Documents/text1.txt
./Documents/text2.txt
./Documents/text3.txt

さらに下記のように xargs コマンドを実行した場合、テキストファイルに記載しているファイルパスのファイル全てに対して rm コマンドが実行されることになります。

$ xargs rm <path.txt

上記コマンドでテキストファイルに記載したファイルパス全てに対して rm が実行される理由について解説しておくと、まず <path.txt の部分がリダイレクト命令で、これにより path.txt の中身が xargs の標準入力に入力されます。

ファイルの中身を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 が実行されることになります。

xargsを利用して2つのコマンドを連携して動作させる様子

これにより、カレントディレクトリ以下にある拡張子が .txt の全ファイルの中から HELLO という文字列を含むファイルを探し出すことができます。

1つ1つパスを指定しながら grepコマンドを実行しなくても、一回のコマンド実行で複数のファイルに対して grep コマンドが実行できるので、コマンド入力の手間を大きく省くことができます。

こんな感じで、xargs コマンドを利用することでファイルの中身やコマンドの実行結果を他のコマンドの引数として利用することができ、これによりコマンド操作時の作業効率を向上させることができます。

また、find コマンドの結果を別のコマンドの引数に指定する際には -exec オプションも便利です。xargs-exec オプションとの違いについては下記ページで解説していますので、詳しくはこちらをご参照ください。

findにおける-execとxargsの違いの解説ページアイキャッチfind -exec と find | xargs との違い

tee:画面への表示とファイル出力を同時に行う

tee は標準入力からの入力を標準出力とファイルの両方に出力するコマンドです。

標準出力はデフォルトでは画面に設定されているので、標準入力からの入力を画面とファイルの両方に出力するコマンドと考えて良いです。

teeコマンドの説明図

基本的には、コマンドからの標準出力への出力は画面 or ファイルなどのように、一箇所にしか出力することができません。

ですが、この tee コマンドを利用すれば、コマンドからの出力を画面とファイルの両方に出力することができるようになり、画面でも出力を確認しつつ、その出力をファイルにも保存するようなことができるようになります。

書式

tee コマンドは、下記のように引数に ファイルパス を指定して実行します。

これにより、tee コマンドに標準入力から入力された文字列等が ファイルパス のファイルと標準出力に出力されるようになります。

$ tee ファイルパス

ただし、xargs コマンド同様に、tee コマンドは単体で使用するのではなく、他のコマンドと併用して使用します。この併用を行う際にパイプ | を利用します。

$ コマンド | tee ファイルパス

パイプを利用することで、コマンドの標準出力への出力が tee コマンドの標準入力に入力されるようになります。そして、tee コマンドがその入力を標準出力と ファイルパス のファイルの両方に出力されるようになります。

使用例

例えば下記のようにコマンドを実行すれば、カレントディレクトリ以下にある拡張子が .txt のファイルのファイルパスを画面に表示しつつ、さらに result.txt ファイルにも出力して保存することができます。

find . -name "*.txt" | tee result.txt

time:プログラムの処理時間の計測を行う

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 userfind コマンド実行中の “ユーザー CPU 時間”
  • 7.44s systemfind コマンド実行中の “システム CPU 時間”
  • 58% cpufind コマンド実行中の “CPU 使用率”
  • 13.730 totalfind コマンド開始から終了までの “経過時間”

経過時間が一番直感的に分かりやすくて、要はコマンド実行するためにエンターキーを押してからコマンドが終了するまでに実際に経過した時間になります。

また、コマンドを処理するのは 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コマンドの説明図

which コマンドは、何かしらのコマンドを実行した際に「実際に実行されるプログラムのファイルパス」を表示するコマンドになります。

まず前提として、コマンドの実行とは要はプログラムの実行になります。コマンドを実行することで、Mac のいずれかのディレクトリに存在するプログラムのファイルが実行されることになります。もっと具体的に言えば、PATH に設定されたディレクトリに存在するプログラムのファイルが実行されることになります。

では、具体的にどのコマンドを実行すれば、どのプログラムのファイルが実行されるのか?

これを調べるコマンドが which になります。

ちなみに、PATH については下記ページで解説していますので、必要に応じて参照していただければと思います。

MacでのPATHの通し方の解説ページアイキャッチMacOSX での 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 の引数として ファイルパス を指定すれば、その ファイルパス のファイルに記述されたコマンドが実行されることになります。

$ source ファイルパス

使用例1

例えば下記のようにコマンドが複数記述されたファイルを用意し(このファイルを commands.txt とします)、

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 の設定が反映されることになります。

逆にいうと、.zshrcexport コマンドを記述しただけだと PATH の設定は反映されません(ファイルに export コマンドを記述するだけでは export コマンドは実際には実行されないので)。

このような、PATH の設定を直ちに反映したいような場合に、export コマンドを記述した .zshrc に対して source コマンドを実行することがあります。

$ source .zshrc

これにより、.zshrc に記述されたコマンドが実行されて PATH の設定が直ちに反映されることになります。

スポンサーリンク

まとめ

このページでは、特にプログラマーの方やプログラミング等の環境構築者がよく利用する Mac のコマンドを紹介しました!

もちろんどういったプログラミングや環境構築を行うかにもよるのですが、私は pskillifconfigpingxargs あたりは非常に利用する機会が多いです。

また、今回紹介したコマンドをすぐ利用する機会は無いとしても、コマンド名とコマンドの役割だけでも覚えておいた方が良いと思います。プログラミングなどを行うのであれば今後利用する可能性は高いですし、コマンド名を覚えておけば、使い方の詳細は man コマンドですぐに調べることができます。

また、オプションもいくつか紹介していますが、これらはほんの一部であって他のオプションも多く存在します。コマンドの動作をより細かに制御をしたいような場合も、是非 man コマンドで他のオプションの存在やその意味合いを調べてみてください。

今回紹介したコマンドは Mac に標準で搭載されているコマンドばかりになりますが、今度は Mac に標準で搭載されていないものの、使えるようにした方が良いコマンドも紹介していきたいと思います!

同じカテゴリのページ一覧を表示

コメントを残す

メールアドレスが公開されることはありません。