このページでは、特にプログラマーの方に是非覚えておいてほしい「Mac のコマンド」を紹介していきます。
下記ページでも Mac のコマンドを紹介していますが、PC 初心者の方でも馴染みのある「ファイル」や「フォルダ(ディレクトリ)」を扱う、どちらかというと初心者の方向けのコマンドを紹介しました。
Macのターミナルでよく使うコマンド集(初心者向け)それに対し、このページではプロセスやネットワークなどの前提知識が必要になるようなコマンドを紹介していきます。
そのため、上記ページで紹介するコマンドに比べると多少難易度は上がりますが、特にプログラミングの環境構築時やプログラムの動作確認時に役立つものが多いですので、是非コマンドの存在や役割だけでも覚えていってください!
このページではコマンドは Mac のターミナルから実行することを前提として解説していきますので、ターミナルの使い方等をご存知ない方は、まずは下記ページを読んでみてください。
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
はリダイレクトやパイプと併用することが多く、これによりコマンド操作での作業効率を高めることができます。
リダイレクトやパイプに関しては下記ページで解説していますので、詳しく知りたい方はコチラを参照していただければと思います。
コマンドのリダイレクトについて解説(標準入力や標準出力の接続先を変更) パイプ | について解説( | と | 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 に標準で搭載されていないものの、使えるようにした方が良いコマンドも紹介していきたいと思います!