はじめに
この記事は以下のターゲットを想定して書いてます。
- Macのターミナルを触ったことがなく、よくわからない...
- え...?シェルって何...?
- え...?パスを通すって何...?サッカー?
という方へ 完全初心者向け の記事です。
したがって、基礎的な概念から雑多に記載してます。
ただ、初心者の方にはかなり分量があり、補足の中で複雑な内容まで踏み込んで説明しています。仕組みとかはどうでもいいや思う方は基本コマンドだけでも、覚えて帰ってください!
この記事を理解するのに役立つと思い、基礎的な概念の理解を助ける資料も付けておきました。難しい単語などにはリンクを付けておいたので、ぜひご活用ください → 補足資料
全て理解できれば、基礎はバッチリ固まるので、難しい記事も読めるようになるかも...!
目次
-
コマンドが実行される仕組み
- 補足
- コマンドが格納されているフォルダとは
- 補足
- ターミナルとは
-
ターミナルを起動してみよう
- 補足
- pwdコマンドについて
- ~(チルダ)について
- 補足
-
ターミナルの基本操作
- 補足
- コマンド履歴
- 補完機能
- 補足
- 基本コマンド←これだけでも覚えて!
-
補足資料
- カーネルについて
- パスについて
- echoコマンドについて
コマンドが実行される仕組み
シェルやコマンドに触れる前に、コマンドを入力して実行されるまでの仕組みを簡単に理解しておきましょう。
コマンドが実行される一連の流れは以下の通りです。
① キーボードからターミナルに入力された文字列を受け取る
② 受け取った文字列のコマンドを検索
③ コマンドが見つかった場合、そのコマンドを実行
④ 実行結果をターミナルに返す
このプロセスのうち、③はMacのOSの中核であるカーネルが行います。
ここで、シェルの役割は一言で言うならば「カーネルのインターフェース」です。つまり、シェルはユーザーとカーネルの仲介してくれているのです。
例えば、lsコマンド( ディレクトリの一覧を表示するコマンド. 詳しくは後述. )をターミナル上で実行するとします。この時の実行されるまでの流れは以下の通りです。
①シェルがキーボードから「ls」という入力を受け取る
②シェルが「ls」というコマンドをコマンドが格納されているフォルダの中から検索
③合致したコマンドをカーネルに実行依頼する
④シェルが出力結果をユーザーの画面に出力
といった具合です。
以下はコマンドが実行されるまでの概念図です。
補足
- コマンドが格納されているフォルダとは?
説明の中で出てきた「コマンドが格納されているフォルダ」について補足します。
コマンドとは一般にファイルのことであり、皆様が普段使われているようなテキストファイルなどと同じような要領のものです( 厳密には異なるが... )
これらのコマンドファイルは「/bin」や「/usr/bin」というフォルダに格納されていることが多いです。(この「/」などのパスの話が難しい方は「パスについて」をご参照ください)
whichというコマンドで、そのコマンドがどこに格納されているのか確かめることできます。それではlsコマンドがどこに存在しているのか確かめてみましょう。
hoge@host ~ % which ls
#出力
/bin/ls
lsコマンドは/bin/というフォルダの中のlsファイルであることが確認できました。
気になる方は他のコマンドも確かめてみてください!
ターミナルとは
前節でシェルについて説明しましたが、ターミナルとシェルは別物であることに注意が必要です。
違いは以下の通りです。
- シェル
ユーザーとカーネル(OSの中核)とのインターフェースとして「コマンドの検索」,「カーネルに命令を出す」など様々なことを行う
- ターミナル
入力画面を提供するだけのソフトウェア
この二つの言葉を混同しないように注意しましょう!
ターミナルを入力装置として、ファイルの作成、削除、移動、圧縮など様々なことを行うことができます。使えるようになると色々便利ですよ!
ターミナルを起動してみよう
それでは、ここでようやくターミナルを起動してみましょう。
起動方法は、こちらのリンク(外部リンク)をご参照ください。
ここで表示されている内容は以下の通りです。
- hogeの部分 -> ユーザー名
- hostの部分 -> ホスト名
- ~の部分 -> カレントディレクトリ
カレントディレクトリとは、シェルの操作により、現在自分が位置しているディレクトリのことです。現在は「~」というディレクトリにいることを示しています。
注意: ディレクトリとはフォルダと同義です。本記事では以後ディレクトリと呼びます。
補足
ここでは話し足りなかったことを三点補足します。
一点目は、pwdコマンドについてです。カレントディレクトリはpwdコマンドで確認することができます。このpwdは諸説ありますが、「Print Working Directory」の略です。(カレントディレクトリはワーキングディレクトリとも呼ばれる)
二点目は ~(チルダ) についてです。~とは ホームディレクトリのことであり、ユーザーごとに用意された、個人用のディレクトリです。一人で使う分にはそこまで意識しなくても良いです。作業をする上で元となるディレクトリだと認識しておけば問題ないです。
三点目はチルダ展開についてです。ホームディレクトリの中で、pwdを実行すると、ホームディレクトリのパスが帰ってきます。このホームディレクトリのパスが ~ と同じなのです。
以下のコマンドの実行結果をご覧ください。
hoge@host ~ % pwd
#出力
/Users/hoge
hoge@host ~ % echo ~
#出力
/Users/hoge
echoコマンドについてこちらのリンクをご参照ください。
ここで言いたいことは、「~とホームディレクトリのパスは同じように扱える」ということです。
例えば、「/Users/hoge/Downloads」の中身を見たい時には、以下のようなことができます。
hoge@host ~ % ls /Users/hoge/Downloads
#出力
Downloadsの中身.....
hoge@host ~ % ls ~/Downloads
#出力
Downloadsの中身.....
このように、~と入力することで、ホームディレクトリのパスとして展開することを、チルダ展開と言います。
ターミナルの基本操作
ターミナルは基本的に矢印キーでカーソルの操作を行います。
入力は通常通りキーボードから行い、削除もback spaceで行うことができます。
今までマウスでカーソル移動したり、まとめて選択して削除していた方は不便に感じるかもしれません。ここでは、そんな人のために私がよく使う便利なショートカットキーを幾つか紹介します!
- 便利な移動方法
キー入力 | 内容 |
---|---|
Ctrl+a | 行頭に移動 |
Ctrl+e | 行末に移動 |
option+矢印(右or左) | 単語ごとに移動 |
- 便利な削除方法
キー入力 | 内容 |
---|---|
Ctrl+u | 全削除 |
Ctrl+w | 一つ前の単語を削除 |
他にも様々なキー操作がありますが、一旦はここまでにしておきます!
補足
ここでは、さらに便利なターミナルライフを過ごすための便利機能を紹介します。
- コマンド履歴
コマンド履歴とは、一度実行したコマンドをもう一度簡単に呼び出すことのできる機能です。コマンド履歴を呼び出す方法は二つあります。
1つ目は、↑キーを入力することで一つずつ実行したコマンドを遡ることができます。
この方法は簡単なキー操作で行えるため、私自身頻繁に用いることがあります。しかし、だいぶ前に実行したコマンドまで戻るのは大変です。そこで二つ目の方法があります。
2つ目の方法は Ctrl + r と入力して検索を行うことができます。実行したコマンドの一部を入力することで検索にヒットしたコマンドが表示されます。複数件検索にヒットした場合、Ctrl + rを再度入力することで、ひとつ前のヒットコマンドに遡ることができます。そして、Escキーを入力することで、そのコマンドをコマンドラインへ乗せることができます。
キー入力 | 内容 |
---|---|
↑ | ひとつ前の実行コマンド |
Ctrl + r | コマンド履歴の検索、複数件ヒットの場合前のヒットコマンドへ移動 |
Esc | ヒットしたコマンドをコマンドラインへ移動 |
- 補完機能
補完機能は、途中まで入力をすれば残りは自動で入力してくれる機能です。非常に便利なのでぜひ覚えておきましょう。
補完機能はTabキーを入力することで用いることができます。
例えば、カレントディレクトリにDownloadsというフォルダがあるとしましょう。この中身を確認するためには
ls Downloads
というコマンドを実行しなければなりません。いちいちDownl...と入力するのは大変ですよね。そこで補完機能の登場です。
Dowまで入力した後に、Tabキーを押すとあら不思議、自動でDownloadsと補完してくれます。要するに、「途中まで打ってTabを押すと自動で残りを入力してくれる」のです。
キー入力 | 内容 |
---|---|
Tab | 途中まで入力した内容を補完 |
基本コマンド
ここでは、ターミナルを使う上で必ず覚えておきたいコマンドを紹介します。ぜひ以下のコマンドだけでも覚えてください!
コマンドを実行する前にコマンドとオプションとコマンドライン引数について紹介しておきます。
コマンドを実行するにあたり、オプションやコマンドライン引数を設定することで動作を細かく指定できます。
まず、オプションとは、コマンドごとに用意されており、これを指定することで様々な動作を指定することができます。例えば、lsコマンドには-lオプションが存在しており、このオプションを指定することで、名前だけではなく様々な情報を確認できるようになります。
注意
コマンドごとに多くのなオプションがあるので、一気に覚えようとせずに、必要に応じてその都度調べましょう。何度も使ってくうちに必要なものは覚えていきます。
次に、コマンドライン引数とは、コマンドの動作対象を指定する引数です。プログラミングを学んだ人には関数の引数のようなものと思ってもらえれば問題ないです。
上のコマンドの例では、中身を見たいディレクトリを指定しています。このように、コマンドの動作対象を指定するのがコマンドライン引数です。
それでは、先ほど起動したターミナルを用いてコマンドを一つずつ実行していきましょう。
lsコマンド
lsコマンドとはディレクトリの中身を表示するコマンドです。
hoge@host ~ % ls
#出力 → カレントディレクトリ(今回は~)の中身
Applications Downloads Movies Public...
コマンドライン引数を指定しないと、カレントディレクトリの中身が表示されます。
引数を指定することで、指定したディレクトリの中身を見ることができます。
hoge@host ~ % ls 対象ディレクトリ
#出力 → 対象ディレクトリの中身
Dir1 Dir2....
また知っておきたいオプションについても紹介します。
オプション | 内容 |
---|---|
-l | ファイルの情報を詳細に表示する |
-A | 全てのファイルやディレクトリを表示 |
-F | ファイルやディレクトリを識別する記号が末尾に表示 |
上記のオプションは覚えておくと、かなり便利です。
具体的にひとつ一つ見ていきましょう。
まず、説明のために以下のような構成のディレクトリを作成しました。
lsコマンドで中身を見てみます。
hoge@host Qiita % ls
#出力
dir1 dir2 file1.html file2.html file3.html
写真と出力結果の対応関係がきちんとわかると思います。
ただ表示名だけでは、どれがファイルでどれがフォルダかわかりにくいこともあると思います( 今回はわかりやすい名前にしましたが )。
そこで、オプションの出番です。
-l オプション
まずは「-l」 オプションから見てみましょう。
hoge@host Qiita % ls -l
#出力
total 0
drwxr-xr-x 2 hoge staff 64 2 23 15:46 dir1
drwxr-xr-x 2 hoge staff 64 2 23 15:46 dir2
-rw-r--r-- 1 hoge staff 0 2 23 15:46 file1.html
-rw-r--r-- 1 hoge staff 0 2 23 15:46 file2.html
-rw-r--r-- 1 hoge staff 0 2 23 15:46 file3.html
ここでは、出力結果のうち一番左の「drwxr-xr-x」のような部分を理解しましょう。
このヘンテコなアルファベットの詳細は以下のようになってます。
最初の文字が「d」ならディレクトリ、「-」ならファイルという意味です。
次の文字列は3文字ごとに見ていきます。それぞれ「読み込み」「書き込み」「実行」の権限があるかを示しています。権限がない場合には「-」となっています。
ここで、なぜ3つも権限があるのかと思うでしょうが、今回は簡単な説明に留めておきます。OSでは複数のユーザーの使用が想定されており、ユーザーごとに権限を変えることができるようになっています。具体的にはユーザーに所属グループを割り当て、そのグループごとに権限を変えることができるといった具合です。そのグループが三つあるというイメージで問題ないです。
一人で使う分には、このグループの概念はあまり意識しなくても問題ないです。
-A オプション
「-A」 オプションは、隠しフォルダを表示することができます。
隠しフォルダとは冒頭に「.」などがついているファイルやディレクトリです。通常ホームディレクトリにもいくつかあります。
ホームディレクトリで実行して、オプションの有無で出力結果を比較しましょう。
今回は(恥ずかしながら)私の~ディレクトリを公開します。(いやん)
# Aオプションなし
hoge@host ~ % ls -A ~
# 出力
Applications LightGBM_compilation.log anaconda3 scikit_learn_data
Desktop Movies bin zshrc
Documents Music miniforge3
Downloads Pictures myprj
Library Public nltk_data
# Aオプションあり
hoge@host ~ % ls -A ~
# 出力
.CFUserTextEncoding .ipython .wdm Movies
.DS_Store .keras .xonshrc Music
.Trash .lesshst .zprofile Pictures
.anaconda .matplotlib .zsh_history Public
.bash_profile .mysql_history .zsh_sessions anaconda3
.cache .python_history .zshrc bin
.conda .rye .zshrc_backup miniforge3
.condarc .sqlite_history Applications myprj
.config .ssh Desktop nltk_data
.continuum .tcshrc Documents scikit_learn_data
.cups .viminfo Downloads zshrc
.docker .vimrc Library
.gitconfig .vscode LightGBM_compilation.log
見比べてもらうと、.がついているファイルが表示されてますね。
みんなのディレクトリにも隠れファイルがあるかも!
-F オプション
最後に「-F」 オプションを見てみましょう。Fオプションは識別子を末尾につけるオプションです。
最後は、-lオプションと同じく用意したQiitaディレクトリで実行してみましょう。
hoge@host Qiita % ls -F
# 出力
dir1/ dir2/ file1.html file2.html file3.html
名前の末尾に「/」があればディレクトリ、なければファイルです。
pwdコマンド
pwdコマンドは、現在自分がいるディレクトリ(カレントディレクトリ)のパスを表示するコマンドです。
コマンド操作では、よく迷子になることがあります。そんな時にはこのpwdコマンドを実行することで、自分の位置を把握しましょう。
hoge@host ~ % pwd
# 出力
/Users/hoge
cdコマンド
cdコマンドは、ディレクトリの移動を行うコマンドです。
Change Directoryの略ですので、覚えやすいと思います。
cdコマンドはコマンドライン引数に注意が必要です。
コマンドライン引数に移動したいディレクトリを指定します。何も指定しないと、ホームディレクトリ(~)に移動します。
それではcdコマンドで移動してpwdコマンドで移動の確認をしてみましょう。
hoge@host ~ % pwd
# 出力 (現在位置)
/Users/hoge
hoge@host ~ % cd Downloads
hoge@host Downloads % pwd
# 出力 (移動後位置)
/Users/hoge/Downloads
mkdirコマンド
mkdirコマンドは、ディレクトリの作成を行うコマンドです。
MaKe DIRectoryの略ですので、覚えやすいと思います。
コマンドライン引数に作成したいディレクトリの名前を指定してください。
以下に使用例を挙げます↓
hoge@host Qiita % ls -F
# 出力 (作成前のディレクトリの中身)
dir1/ dir2/ file1.html file2.html file3.html
hoge@host Qiita % mkdir dir3
hoge@host Qiita % ls -F
# 出力 (作成後のディレクトリの中身)
dir1/ dir2/ dir3/ file1.html file2.html file3.html
dir3という名前のディレクトリが作成されているのが確認できると思います。
touchコマンド
touchコマンドは、ファイルの作成を行うコマンドです。
コマンドライン引数に作成したいファイルの名前を指定してください。
以下に使用例を挙げます↓
hoge@host Qiita % ls -F
# 出力 (作成前のディレクトリの中身)
dir1/ dir2/ dir3/ file1.html file2.html file3.html
hoge@host Qiita % touch file4.html
hoge@host Qiita % ls -F
# 出力 (作成後のディレクトリの中身)
dir1/ dir2/ dir3/ file1.html file2.html file3.html file4.html
rmコマンド
rmコマンドは、ファイルやディレクトリの削除を行うコマンドです。
RMoveの略ですので、覚えやすいと思います。
コマンドライン引数に削除したいファイルやディレクトリを指定します。
ただ、注意が必要で、オプションを指定しないとファイルしか削除できません。
ディレクトリを削除したい場合には「-r」オプションを指定する必要があります。
このrとはRecursiveの頭文字であり、再帰的に削除をすることを指定するオプションです。従って、ディレクトリのような複数ファイルが含まれているものでも再帰的に削除することできます。
まとめ
紹介したコマンドについて、まとめを掲載します。
今一度確認してみてください。
コマンド | 内容 |
---|---|
ls | ディレクトリの中身を表示 |
pwd | カレントディレクトリのパス表示 |
cd | ディレクトリの移動 |
mkdir | ディレクトリの作成 |
touch | ファイルの作成 |
rm | ファイルやディレクトリの削除 |
補足資料
ここでは、この記事を読むために必要な概念を簡単に紹介します。
カーネルについて
カーネルとは、「OSの基本機能の役割を担うソフトウェア」のことです。
まず、OSとは皆さんのパソコンにも入っているWindowsやMacと呼ばれるものです。OSはOperation Systemの略であり、我々の操作を解釈して実際にパソコンの中で実行してくれるものです。その他、様々な機能がありますが、ここでは割愛します。
そんなOSの中核と呼ばれているのがカーネルです。ユーザーがアプリケーションを実行するときに、このリクエストをカーネルが処理して実行してくれます。
つまり、カーネルとは、我々とPCを結びつけてくれる大きな役割を持ったものと認識してくれれば問題ないです。
パスについて
パスとは、ディレクトリやファイルの住所のようなものです。
具体的には、目的のファイルまでの経路のディレクトリを階層的に繋ぎ合わせた文字列であり、絶対パスと相対パスの2種類が存在します。この繋ぎの部分はOSごとに異なりMacでは「/」で繋ぎ合わせを行います。
詳細は以下の概念図を参照してください。
いくつかわからない単語があると思うので簡単に説明します。
まず、ルートディレクトリとは、PCにおいて最上位に位置するディレクトリであり、全てのディレクトリやファイルはこの中に格納されています。
このルートディレクトリから段階的にディレクトリを通過し、目的のファイルかディレクトリまでの一連の経路を「/」で繋ぎ合わせてものが絶対パスです。
それに対し、相対パスは、カレントディレクトリからの経路を繋ぎ合わせたものです。相対パスでは、現在のディレクトリを「.」、一つ上のディレクトリ(親ディレクトリ)を「..」で表します。
echoコマンドについて
echoコマンドは、コマンドラインに入力した文字列を、画面に出力として表示するためのコマンドです。
使用例はこんな感じ↓
hoge@host ~ % echo "Hello World"
# 出力
Hello World
「なんの意味が...」と思うかもしれませんが、意外と使うことがあります。
例えば、シェル変数などを展開するのに使えます。
シェル変数とはシェルの中で定める変数のことです。例えば、a=10とするとaという変数は10として扱われます。
以下で実行例を見てみましょう。
# シェル変数の定義
hoge@host ~ % a=10
# シェル変数の展開
hoge@host ~ % echo "$a"
#出力
10
このように、代入されたものを展開したりできます。
今回は割愛しますが、同じ要領で環境変数の展開もできます($PATHなど)。気になる人は調べてみてください!