第2章:ターミナルの世界

この章で学ぶこと

  • GUIとCLIの違い
  • ターミナルの起動方法
  • 基本的なコマンド操作
  • ファイルシステムの仕組み
  • vimエディタの基礎

---

2.1 GUIとCLI

2種類のインターフェース

コンピュータを操作する方法には、大きく分けて2種類あります。

GUI(Graphical User Interface)

日常的に使っているのはGUIです。

  • マウスでアイコンをクリック
  • ウィンドウをドラッグ
  • メニューから選択

直感的で分かりやすいのが特徴です。

CLI(Command Line Interface)

プログラマーが主に使うのはCLIです。

  • キーボードでコマンドを入力
  • 文字だけの画面
  • 黒い画面に白い文字

最初は難しそうに見えますが、慣れるとGUIより速く、正確に操作できます。

なぜCLIを使うのか

CLIには多くの利点があります。

1. 高速な操作

マウスを動かしてクリックするより、キーボードでコマンドを打つ方が速いです。

# 1000個のファイルを一括で名前変更
# GUIなら1000回クリックが必要
# CLIなら1行で完了
for i in *.txt; do mv "$i" "${i%.txt}.md"; done

2. 自動化

CLIのコマンドは、スクリプトとして保存できます。同じ作業を何度も自動で実行できます。

3. 再現性

「このボタンをクリックして、あのメニューを選んで...」という説明より、コマンド1行を共有する方が正確です。

4. リモート操作

サーバーなど、画面のないコンピュータはCLIでしか操作できません。

5. 42での必須スキル

42のPiscineでは、CLIの操作が前提となっています。ターミナルが使えないと、課題を提出することすらできません。

ターミナルとは

ターミナル(端末)は、CLIを使うためのアプリケーションです。

歴史的には、大型コンピュータに接続するための物理的な端末機器でした。現在は、そのエミュレーション(模倣)としてソフトウェアで実現されています。

様々な呼び方がありますが、ほぼ同じものを指します:

  • ターミナル(Terminal)
  • コンソール(Console)
  • コマンドライン(Command Line)
  • シェル(Shell)- 厳密には別物だが、よく混同される
  • ---

    2.2 ターミナルの起動

    Macの場合

  • Command + Space でSpotlightを開く
  • 「terminal」と入力
  • Terminal.appを起動

または:

  • Finder → アプリケーション → ユーティリティ → ターミナル
  • Windowsの場合

    Windowsでは、WSL(Windows Subsystem for Linux)をインストールすることをお勧めします。

  • PowerShellを管理者として実行
  • 以下のコマンドを実行:
wsl --install
  • 再起動後、WSLが使えるようになる
  • Ubuntuが自動でインストールされる

WSLを使うと、Windows上でLinux環境を使えます。42の環境に近い状態で学習できます。

Linuxの場合

ディストリビューションによって異なりますが:

  • Ctrl + Alt + T でターミナルが開くことが多い
  • アプリケーションメニューから「Terminal」を探す
  • ターミナルが開いたら

    ターミナルを開くと、このような画面が表示されます:

    username@hostname:~$
    

    これをプロンプトと呼びます。「コマンドを入力してください」という合図です。

  • username: あなたのユーザー名
  • hostname: コンピュータの名前
  • ~: 現在のディレクトリ(ホームディレクトリ)
  • $: 一般ユーザーであることを示す(rootユーザーは#
  • プロンプトの後ろでカーソルが点滅していれば、コマンドを入力できる状態です。

    ---

    2.3 最初のコマンド

    コマンドの基本形

    コマンド名 オプション 引数
    

  • コマンド名: 実行したい命令
  • オプション: コマンドの動作を変更する(-で始まる)
  • 引数: コマンドに渡すデータ(ファイル名など)
  • echo - 文字を表示する

    最も簡単なコマンドから始めましょう。

    $ echo Hello
    Hello
    

    echoは、引数として渡された文字をそのまま表示するコマンドです。

    $ echo "Hello, World!"
    Hello, World!
    

    スペースを含む場合は、引用符で囲みます。

    pwd - 現在地を確認する

    pwd(Print Working Directory)は、現在いるディレクトリを表示します。

    $ pwd
    /Users/username
    

    ターミナルでは、常に「どこかのディレクトリにいる」状態です。Finderで開いているフォルダと同じ概念です。

    ls - ファイル一覧を表示する

    ls(List)は、現在のディレクトリにあるファイルとフォルダを一覧表示します。

    $ ls
    Desktop    Documents  Downloads  Pictures
    

    オプションをつけると、より詳しい情報が見られます:

    $ ls -l
    total 0
    drwx------   5 username  staff   160 Jan  1 12:00 Desktop
    drwx------   3 username  staff    96 Jan  1 12:00 Documents
    drwx------   3 username  staff    96 Jan  1 12:00 Downloads
    drwx------   3 username  staff    96 Jan  1 12:00 Pictures
    

  • -l: 詳細表示(long format)
  • -a: 隠しファイルも表示(.で始まるファイル)
  • -la: 両方のオプションを組み合わせ

$ ls -la
total 24
drwxr-xr-x  10 username  staff   320 Jan  1 12:00 .
drwxr-xr-x   5 root      admin   160 Jan  1 12:00 ..
-rw-------   1 username  staff   123 Jan  1 12:00 .bash_history
drwx------   5 username  staff   160 Jan  1 12:00 Desktop

cd - ディレクトリを移動する

cd(Change Directory)は、別のディレクトリに移動するコマンドです。

$ cd Desktop
$ pwd
/Users/username/Desktop

特別なディレクトリ指定:

$ cd ~      # ホームディレクトリに移動
$ cd ..     # 1つ上のディレクトリに移動
$ cd /      # ルートディレクトリに移動
$ cd -      # 直前にいたディレクトリに移動

clear - 画面をクリアする

clearは、ターミナルの画面をきれいにします。

$ clear

ショートカット Ctrl + L でも同じことができます。

---

2.4 ファイルとディレクトリの操作

mkdir - ディレクトリを作成する

mkdir(Make Directory)は、新しいフォルダを作成します。

$ mkdir my_project
$ ls
Desktop  Documents  Downloads  my_project  Pictures

touch - 空のファイルを作成する

touchは、空のファイルを作成します(既存ファイルの場合は更新日時を変更)。

$ touch hello.c
$ ls
hello.c

cp - ファイルをコピーする

cp(Copy)は、ファイルをコピーします。

$ cp hello.c hello_backup.c
$ ls
hello.c  hello_backup.c

ディレクトリをコピーする場合は -r オプション(recursive)が必要です:

$ cp -r my_project my_project_backup

mv - ファイルを移動・名前変更する

mv(Move)は、ファイルを移動または名前変更します。

# 名前変更
$ mv hello.c main.c

# 移動
$ mv main.c my_project/

rm - ファイルを削除する

rm(Remove)は、ファイルを削除します。

$ rm hello_backup.c

注意: ターミナルで削除したファイルは「ゴミ箱」に入りません。完全に削除されます

ディレクトリを削除する場合:

$ rm -r my_project_backup  # ディレクトリとその中身を削除

非常に危険なコマンド:

# 絶対に実行しないでください
$ rm -rf /  # システム全体を削除してしまう

cat - ファイルの内容を表示する

cat(Concatenate)は、ファイルの内容を表示します。

$ cat hello.c
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

---

2.5 ファイルシステムの構造

ディレクトリツリー

コンピュータのファイルは、ツリー構造で整理されています。

/                       ← ルートディレクトリ(最上位)
├── bin/                ← 基本コマンド
├── etc/                ← 設定ファイル
├── home/               ← ユーザーのホームディレクトリ(Linuxの場合)
│   └── username/
│       ├── Desktop/
│       ├── Documents/
│       └── Downloads/
├── Users/              ← ユーザーのホームディレクトリ(Macの場合)
│   └── username/
├── tmp/                ← 一時ファイル
├── usr/                ← ユーザー用プログラム
│   ├── bin/
│   └── local/
└── var/                ← 可変データ

パス(Path)

ファイルやディレクトリの場所を示す文字列をパスと呼びます。

絶対パス: ルート(/)から始まる完全な位置

/Users/username/Documents/report.txt

相対パス: 現在のディレクトリからの相対的な位置

Documents/report.txt   # 現在地がホームディレクトリの場合
../Downloads/file.zip  # 1つ上のディレクトリのDownloads内

特殊なディレクトリ表記

| 表記 | 意味 | |------|------| | / | ルートディレクトリ | | ~ | ホームディレクトリ | | . | 現在のディレクトリ | | .. | 親ディレクトリ(1つ上) |

$ cd ~/Documents    # ホームのDocumentsに移動
$ cd ./my_project   # 現在地のmy_projectに移動(./は省略可能)
$ cd ../../         # 2つ上のディレクトリに移動

---

2.6 便利なターミナル操作

タブ補完

ファイル名やコマンド名を途中まで入力して Tab キーを押すと、自動で補完されます。

$ cd Doc[Tab]
$ cd Documents/  # 自動補完される

候補が複数ある場合は、Tab を2回押すと一覧が表示されます。

コマンド履歴

(上矢印)キーで、過去に実行したコマンドを呼び出せます。

$ [↑を押す]
$ ls -la  # 直前のコマンドが表示される

Ctrl + R で履歴を検索することもできます。

コピー&ペースト

ターミナルでのコピー&ペーストは、通常と異なる場合があります:

Mac:

  • コピー: Command + C
  • ペースト: Command + V

Linux/WSL:

  • コピー: Ctrl + Shift + C
  • ペースト: Ctrl + Shift + V
  • 強制終了

    プログラムが止まらなくなったら:

  • Ctrl + C: 実行中のコマンドを中止
  • Ctrl + D: 入力の終了(EOFを送る)
  • Ctrl + Z: プログラムを一時停止(バックグラウンドへ)
  • ---

    2.7 vimエディタ入門

    なぜvimなのか

    vimは、ターミナル上で動作するテキストエディタです。

    42のPiscineでは、vimの使用が推奨(場合によっては必須)です。最初は難しく感じますが、慣れると非常に効率的にコードを書けるようになります。

    vimの特徴

  • マウス不要、キーボードだけで操作
  • 軽量で高速
  • どのサーバーにもほぼ確実にインストールされている
  • 独自の操作体系(モード)

vimの起動と終了

$ vim hello.c    # hello.cをvimで開く(なければ新規作成)

最も重要なこと: vimの終了方法

vimを終了できずに困る人が非常に多いです。

:q    # 終了(変更がなければ)
:q!   # 強制終了(変更を破棄)
:wq   # 保存して終了
:w    # 保存(終了しない)

これらのコマンドは、ノーマルモードで入力します。

vimのモード

vimには複数のモードがあります。これがvimの特徴であり、難しさの原因でもあります。

1. ノーマルモード(Normal Mode)

  • vimを起動した直後の状態
  • カーソル移動、削除、コピーなどの操作
  • 文字の入力はできない

2. 挿入モード(Insert Mode)

  • 文字を入力するモード
  • 通常のエディタと同じように文字が打てる
  • i キーでノーマルモードから移行
  • Esc キーでノーマルモードに戻る

3. コマンドモード(Command Mode)

  • : で始まるコマンドを入力
  • 保存、終了、検索置換など
  • : を押すとコマンドモードに入る
  • 基本的な操作

    文字を入力する

  • vimを起動(ノーマルモード)
  • i を押す(挿入モードへ)
  • 文字を入力
  • Esc を押す(ノーマルモードへ)
  • :wq で保存して終了

カーソル移動(ノーマルモード)

| キー | 動作 | |------|------| | h | 左に移動 | | j | 下に移動 | | k | 上に移動 | | l | 右に移動 | | 0 | 行頭に移動 | | $ | 行末に移動 | | gg | ファイルの先頭に移動 | | G | ファイルの末尾に移動 | | w | 次の単語に移動 | | b | 前の単語に移動 |

矢印キーも使えますが、ホームポジションから手を離さなくて済む hjkl を覚えることをお勧めします。

削除(ノーマルモード)

| キー | 動作 | |------|------| | x | カーソル位置の1文字を削除 | | dd | 行を削除 | | dw | 単語を削除 | | d$ | カーソルから行末まで削除 |

コピー&ペースト(ノーマルモード)

| キー | 動作 | |------|------| | yy | 行をコピー(yank) | | p | ペースト(カーソルの後ろに) | | P | ペースト(カーソルの前に) |

元に戻す・やり直す

| キー | 動作 | |------|------| | u | 元に戻す(Undo) | | Ctrl + r | やり直す(Redo) |

vimの設定

ホームディレクトリに .vimrc ファイルを作成すると、vimの設定をカスタマイズできます。

$ vim ~/.vimrc

基本的な設定例:

" 行番号を表示
set number

" タブをスペース4つに
set tabstop=4
set shiftwidth=4
set expandtab

" 構文ハイライト
syntax on

" 検索時に大文字小文字を無視
set ignorecase

" インクリメンタルサーチ
set incsearch

" 対応する括弧をハイライト
set showmatch

vimtutor

vimには公式のチュートリアルがあります。

$ vimtutor

30分ほどで基本操作を学べます。ぜひ一度やってみてください。

---

2.8 実践:作業ディレクトリの作成

学習用のディレクトリを作成しましょう。

手順

# ホームディレクトリに移動
$ cd ~

# 42用のディレクトリを作成
$ mkdir 42

# 42ディレクトリに移動
$ cd 42

# c_beginner用のディレクトリを作成
$ mkdir c_beginner

# c_beginnerに移動
$ cd c_beginner

# 現在地を確認
$ pwd
/Users/username/42/c_beginner

# 確認
$ ls -la
total 0
drwxr-xr-x  2 username  staff   64 Jan  1 12:00 .
drwxr-xr-x  3 username  staff   96 Jan  1 12:00 ..

これで、C言語学習用のディレクトリが準備できました。

最初のファイルを作成

# 空のCファイルを作成
$ touch hello.c

# vimで開く
$ vim hello.c

vimが開いたら:

  • i で挿入モードに入る
  • 以下のコードを入力:
  • #include <stdio.h>
    
    int main(void)
    {
        printf("Hello, World!\n");
        return 0;
    }
    

  • Esc でノーマルモードに戻る
  • :wq で保存して終了

# ファイルが作成されたか確認
$ ls
hello.c

# 内容を確認
$ cat hello.c
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

おめでとうございます!最初のCプログラムのファイルが作成できました。次の章では、このプログラムを実際に動かします。

---

2.9 この章のまとめ

学んだコマンド

| コマンド | 説明 | |----------|------| | echo | 文字を表示 | | pwd | 現在のディレクトリを表示 | | ls | ファイル一覧を表示 | | cd | ディレクトリを移動 | | clear | 画面をクリア | | mkdir | ディレクトリを作成 | | touch | 空のファイルを作成 | | cp | ファイルをコピー | | mv | ファイルを移動・名前変更 | | rm | ファイルを削除 | | cat | ファイルの内容を表示 | | vim | テキストエディタを起動 |

vimの基本

| 操作 | コマンド | |------|----------| | 挿入モードに入る | i | | ノーマルモードに戻る | Esc | | 保存 | :w | | 終了 | :q | | 保存して終了 | :wq | | 強制終了 | :q! |

次の章の予告

次章では、作成した hello.cコンパイルして実行します。C言語のプログラムが実際に動く瞬間を体験しましょう。

---

Column: ターミナルの歴史

現代のターミナルアプリは、実は古いコンピュータの時代の名残です。

テレタイプの時代

1960年代、コンピュータは非常に高価で、1台のコンピュータを多くの人が共有していました。ユーザーはテレタイプ(タイプライターのような端末)を使って、メインコンピュータに接続していました。

入力した文字は紙に印刷され、コンピュータからの応答も紙に印刷されました。画面すらなかった時代です。

ビデオ端末の登場

1970年代になると、紙の代わりにブラウン管ディスプレイが使われるようになりました。これが「ターミナル」の原型です。

緑色や琥珀色の文字が黒い画面に表示される、映画で見るような「ハッカー」のイメージは、この時代の名残です。

現代のターミナル

現代のターミナルアプリ(Terminal.app、iTerm2、Windowsターミナルなど)は、この歴史的な端末をソフトウェアで再現したものです。

「ターミナルエミュレータ」と呼ばれるのはこのためです。物理的な端末はもう存在しませんが、その操作方法は今も受け継がれています。

黒い画面に白い文字、コマンドを打って応答を待つ。この基本的なインターフェースは、50年以上変わっていません。そして、これからも変わらないでしょう。

---

確認問題

問題1

現在のディレクトリを表示するコマンドは何ですか?

解答

pwd(Print Working Directory)

問題2

以下の操作をするコマンドを答えてください:
  • ディレクトリ「my_folder」を作成
  • 「my_folder」に移動
  • 空のファイル「test.c」を作成

解答

mkdir my_folder
cd my_folder
touch test.c

問題3

~ は何を表しますか?

解答

ホームディレクトリ(ユーザーのホームフォルダ)

問題4

vimで保存せずに強制終了するコマンドは何ですか?

解答

:q!

問題5

vimで文字を入力するには、まず何をする必要がありますか?

解答

i を押して挿入モード(Insert Mode)に入る必要がある。

---

次の章では、いよいよCプログラムをコンパイルして実行します!