(ch02-ubuntu-terminal)= # 第2章 Ubuntuの端末を使う この章では、Ubuntu を使えるようにして、コマンドで移動したりディレクトリを作ったりします。 第3章以降で使う AI 開発エージェントも uv も、すべてこの中で動きます。 本書は Ubuntu を **文字だけで操作します**。 デスクトップ画面やマウスは使いません。 その理由と、そのための環境の作り方から始めます。 ## 2.1 フロントマシンとUbuntu 本書の学習環境は、大きく2つの役割に分かれます。 **フロントマシン** は、いま使っているパソコンです。 Windows でも macOS でもかまいません。 ここでは、文字を打つための **端末アプリ** を動かします。 **Ubuntu** は、Python を動かす側です。 Windows や macOS と同じ基本ソフト(OS)の仲間で、その中でも **Linux** と呼ばれる種類のひとつです。 無料で使えて、プログラムを動かす場所として広く使われています。 同じパソコンの中に用意することも、別の場所にあるサーバを使うこともできます。 どちらの場合も、新しいパソコンを買う必要はありません。 本書が Ubuntu を使う理由は2つあります。 ひとつは、AI 開発エージェントも uv も Linux で動かす前提の情報が多く、つまずいたときに調べやすいことです。 もうひとつは、Linux が Web のサーバやクラウドで広く使われていて、ここで覚えた操作が先々そのまま使えることです。 図2-1が全体像です。 ```{d2} :alt: フロントマシンの端末アプリと Ubuntu のシェルが文字をやりとりし、Ubuntu 側にシェル・Python / uv・AI開発エージェントが置かれていることを示した図。 :width: 75% :align: center direction: right front: "フロントマシン\n(Windows / macOS)" { term: "端末アプリ" } ubuntu: "Ubuntu" { shell: "シェル" py: "Python / uv" ai: "AI開発エージェント" } front.term -> ubuntu.shell: "文字を送る" ubuntu.shell -> front.term: "文字を返す" ``` {.caption-center} 図2-1: フロントマシンとUbuntuの関係 キーボードで打った文字が Ubuntu に届き、そこで処理された結果が文字として手元の画面に返ってきます。 やりとりするのは文字だけです。 画像も、ウィンドウも、マウスの位置も送りません。 この方式には利点が3つあります。 **環境を選ばない**。 Windows でも macOS でも、手元にある端末アプリから同じ操作ができます。 Ubuntu に入ってしまえば、そのあとの手順はフロントマシンの種類によらず同じです。 **そのまま記録できる**。 打ったコマンドと結果は文字なので、コピーして人に渡せますし、AI に貼り付けて相談できます。 第1章で決めた進め方は、この性質の上に成り立っています。 **離れた場所でも同じ**。 手元の Ubuntu でも、遠くのサーバでも、つないでしまえば操作は同じです。 学習のあとで会社のサーバやクラウドを使うことになっても、ここで覚えた操作がそのまま通用します。 なお、Ubuntu にはデスクトップ画面のある版もあります。 本書がそれを使わないのは、上の3つの利点を保つためです。 ファイルをマウスで並べ替える操作は、記録もできませんし、遠くのサーバでは使えません。 ## 2.2 3つの用意のしかた Ubuntu を用意する方法を、3つ紹介します。 どれか1つを選んでください。 3つの位置関係を、図2-2に示します。 ```{d2} :alt: WSL と OrbStack は同じパソコンの中に Ubuntu を置き、ssh はネットワーク越しに別のサーバの Ubuntu へつなぐという、用意のしかた3通りの違いを並べた図。 :width: 75% :align: center direction: down wsl: "WSL(Windows)" { style.fill: "#f1f3f4" pc1: "同じパソコンの中" { u1: "Ubuntu" { style.fill: "#e8f0fe" } } } orb: "OrbStack(macOS)" { style.fill: "#f1f3f4" pc2: "同じパソコンの中" { u2: "Ubuntu" { style.fill: "#e8f0fe" } } } ssh: "ssh 接続(どちらでも)" { style.fill: "#f1f3f4" pc3: "手元のパソコン" srv: "別のサーバ" { u3: "Ubuntu" { style.fill: "#e8f0fe" } } pc3 -> srv: "ネットワーク越し" } ``` {.caption-center} 図2-2: Ubuntu をどこに置くかの違い 必要なものと費用の違いを、表2-1にまとめます。 ```{list-table} 表2-1: Ubuntuを用意する3つの方法 :header-rows: 1 :widths: 22 26 26 26 * - - WSL - OrbStack - リモート接続 * - フロントマシン - Windows - macOS - どれでも * - Ubuntu の場所 - 同じパソコンの中 - 同じパソコンの中 - 別のサーバ * - 必要なもの - Windows 10(2004以降)か 11 - OrbStack - 接続先とアカウント * - 費用 - 無料 - 個人利用は無料 - サーバの費用 * - 本書での節 - 2.3 - 2.4 - 2.5 ``` 判断に迷ったら、次のように選んでください。 - Windows を使っている → **2.3(WSL)** - Mac を使っている → **2.4(OrbStack)** - 会社や学校で用意された Ubuntu がある、または VPS を借りている → **2.5(ssh)** 3つとも、つないだあとの操作は同じです。 2.6 以降は、どれを選んでも共通の内容になります。 先に、画面例の見方だけ決めておきます。 本書では、Ubuntu に入ったあとの画面を次のように表記します。 ```text taro@ubuntu:~$ ``` `taro` は利用者名、`ubuntu` はコンピュータの名前です。 読者の画面では、この部分が自分の環境の名前になります。 読み方は 2.6 で詳しく扱います。 Mac で Docker や Lima、Windows で Hyper-V の仮想マシンを使う方法もあります。 本書がそれらを扱わないのは、手順を1つに絞るためで、優劣の判断ではありません。 既に使い慣れた環境があるなら、それを使ってかまいません。 必要なのは「Ubuntu のシェルに入れること」だけです。 ## 2.3 Windows: WSLでUbuntuを用意する **WSL**(Windows Subsystem for Linux)は、Windows の中で Linux を動かす仕組みです。 Windows に組み込まれている機能なので、追加で買うものはありません。 必要な条件は2つです。 - Windows 10 バージョン 2004 以降、または Windows 11 - 管理者権限(インストール時のみ) ### 2.3.1 インストール スタートメニューの検索欄に「PowerShell」と入力し、表示された結果を右クリックして「管理者として実行」を選びます。 開いた画面に、次のコマンドを入力します。 ```powershell wsl --install -d Ubuntu-24.04 ``` 必要な機能と Ubuntu 24.04 がまとめて入ります。 終わったら、案内に従って Windows を再起動してください。 再起動後、スタートメニューに「Ubuntu 24.04」が増えています。 最初に起動すると、Ubuntu の中で使う利用者名(`Enter new UNIX username`)とパスワード(`New password`)を続けて聞かれます。 パスワードは確認のため2回入力します。 利用者名は半角英小文字にしてください。 Windows のアカウント名と同じである必要はありません。 パスワードは入力しても画面に何も表示されませんが、文字は受け付けられています。 このパスワードは、あとで `sudo` を使うときに必要になります。 設定が終わると、プロンプトが表示されます。 ここから先は、2.6 に進んでください。 ### 2.3.2 2回目以降の起動 次のいずれかの方法で、Ubuntu に入れます。 - スタートメニューの「Ubuntu 24.04」を開く - **Windows Terminal** を開き、タブ右側の下向き矢印から「Ubuntu 24.04」を選ぶ - PowerShell やコマンドプロンプトで `wsl` と入力する Windows Terminal は Windows 11 に最初から入っています。 Windows 10 では、Microsoft Store から入れられます。 タブで複数の画面を開けるので、本書の作業には便利です。 ### 2.3.3 状態の確認と終了 入っている Linux の一覧と状態は、PowerShell から確認できます。 ```powershell wsl -l -v ``` `Running` と表示されていれば動いています。 Ubuntu の中で `exit` と入力すると、Windows の画面に戻ります。 完全に止めたいときは、PowerShell から次を実行します。 ```powershell wsl --shutdown ``` ### 2.3.4 Windows 側のファイルの扱い WSL からは、Windows のドライブが `/mnt/c` のように見えます。 ただし、**本書の作業は Linux 側のホームディレクトリで行ってください**(ホームディレクトリは 2.6 で説明します)。 `/mnt/c` の下は Windows のファイルシステムなので、読み書きが遅くなり、権限の扱いも変わります。 Python のプロジェクトを置く場所としては向きません。 ## 2.4 macOS: OrbStackでUbuntuを用意する **OrbStack** は、macOS で Linux のマシンや Docker のコンテナを動かすアプリです。 個人利用は無料で、動作が軽いことが特徴です。 ### 2.4.1 インストール Homebrew(macOS 用のパッケージ管理ツール)を使っている場合は、次のコマンドで入ります。 ```bash brew install orbstack ``` 使っていない場合は、[orbstack.dev](https://orbstack.dev/) からダウンロードしてください。 インストールしたら、一度 OrbStack を起動しておきます。 以降の操作は、macOS の「ターミナル」アプリから行います。 ### 2.4.2 Ubuntu のマシンを作る macOS のターミナルで、次のコマンドを実行します。 ```bash orb create ubuntu:24.04 rpg ``` `rpg` は、これから作るマシンの名前です。 初回はイメージのダウンロードがあるため、少し時間がかかります。 できたかどうかは `orb list` で確認できます。 ```text rpg running ubuntu noble arm64 686.2 MB 192.168.139.89 ``` 左から、マシン名、状態、ディストリビューション、版のコードネーム、CPU の種類、使っている容量、IP アドレスです。 `running` になっていれば使えます。 `noble` は Ubuntu 24.04 のコードネームです。 ほかにマシンを作っていれば、その行も並びます。 ### 2.4.3 Ubuntu に入る 次のコマンドで、Ubuntu のシェルに入ります。 ```bash orb -m rpg ``` `-m` は machine の頭文字で、どのマシンに入るかの指定です。 マシンが1つだけなら `orb` だけでも入れます。 ここで、OrbStack 特有の動きがあります。 ```text taro@rpg:/mnt/mac/tmp$ pwd /mnt/mac/tmp taro@rpg:/mnt/mac/tmp$ cd ~ taro@rpg:~$ pwd /home/taro ``` 入った直後の場所が `/mnt/mac/tmp` になっています。 これは、macOS のターミナルで `/tmp` にいる状態から `orb -m rpg` を実行したためです。 OrbStack は、macOS 側でいた場所を引き継いで Linux に入ります。 `/mnt/mac` の下が macOS のファイルシステムです。 本書の作業は Linux 側のホームで行うので、**入ったら `cd ~` で移動してください**。 `~` は 2.6 で説明するホームディレクトリです。 WSL の `/mnt/c` と同じ理由で、`/mnt/mac` の下にプロジェクトを置くことは避けます。 ### 2.4.4 終了と再開 Ubuntu の中で `exit` と入力すると、macOS のターミナルに戻ります。 マシン自体は動いたままなので、`orb -m rpg` でいつでも戻れます。 止めたいときは次のコマンドを使います。 ```bash orb stop rpg ``` 止めても中身は残ります。 `orb start rpg` で元の状態から再開できます。 ここから先は、2.6 に進んでください。 ## 2.5 リモートのUbuntuにsshで接続する すでに Ubuntu のサーバがある場合や、VPS(インターネット上に借りる仮想サーバ)を借りている場合は、**ssh** で接続します。 **ssh** は、離れたコンピュータのシェルを、暗号化した通信で操作する仕組みです。 フロントマシンの種類は問いません。 Windows 10 以降、macOS、Linux には、ssh のクライアントが最初から入っています。 必要な情報は3つです。 - 接続先のアドレス(IP アドレスまたはホスト名) - 利用者名 - パスワード、または鍵 ### 2.5.1 接続する 端末アプリで、次のように入力します。 ```bash ssh taro@192.168.139.20 ``` `利用者名@アドレス` という形です。 初めて接続するときは、次のように確認を求められます。 ```text The authenticity of host '192.168.139.20 (192.168.139.20)' can't be established. ED25519 key fingerprint is SHA256:157JhKRRp2cg8gj1Y+IZRmYY9JGUgwPqXkhA3JPwDHU. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.139.20' (ED25519) to the list of known hosts. taro@192.168.139.20's password: Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 7.0.14-orbstack-00380-ga7e0a2dc9535 aarch64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. taro@ubuntu-server:~$ pwd /home/taro ``` 最初の質問は「この接続先を初めて見たが、本当につないでよいか」という確認です。 初めての接続で表示されるのは正常な動作です。 自分で用意した接続先か、管理者から教えられた接続先であれば、`yes` と入力してかまいません。 `yes` と入力すると、接続先の指紋が記録され、次回からは聞かれません。 2回目以降に同じ質問が出たら、接続先が変わったか、通信の途中に第三者が割り込んでいる(中間者攻撃と呼ばれる状態の)可能性があります。 心当たりがなければ、接続せずに管理者に確認してください。 次にパスワードを聞かれます。 入力しても画面には何も表示されませんが、打てています。 そのあとに出るのが、Ubuntu の案内文とプロンプトです。 プロンプトの `ubuntu-server` は接続先のコンピュータ名で、`pwd` の結果からわかるとおり、接続先のホームディレクトリにいます。 案内文の内容は接続先によって変わります。 版の番号やカーネルの名前(`GNU/Linux` に続く部分)は、時期や接続先によって変わるので、同じ文字列が出なくても問題ありません。 上の例は手元に用意した Ubuntu へ接続したもので、カーネルの名前にその環境の名前が出ています。 ### 2.5.2 鍵で接続する パスワードを毎回入力するのは手間ですし、安全でもありません。 **公開鍵認証** を使うと、鍵のファイルで本人確認ができます。 フロントマシンで鍵を作ります。 ```bash ssh-keygen -t ed25519 ``` 保存先とパスフレーズを聞かれます。 保存先はそのまま Enter でかまいません。 パスフレーズは、鍵を使うときの合言葉です。空でも動きますが、設定することをお勧めします。 作った鍵を、接続先に登録します。 ```bash ssh-copy-id taro@192.168.139.20 ``` 一度だけパスワードを聞かれ、そのあとは鍵で接続できるようになります。 `ssh-copy-id` は macOS と Linux には入っていますが、Windows の ssh には付いていません。 Windows から接続する場合は、PowerShell で鍵の中身を送り込みます。 ```powershell type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh taro@192.168.139.20 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" ``` やっていることは `ssh-copy-id` と同じで、公開鍵を接続先の `~/.ssh/authorized_keys` に書き足しています。 ### 2.5.3 接続先で ssh が動いていない場合 `Connection refused` と表示される場合、接続先で ssh の受け付けが動いていません。 接続先のコンピュータで、次のコマンドを実行します。 ```bash sudo apt install openssh-server sudo systemctl enable --now ssh ``` VPS の多くは最初から動いています。 自分で用意した Ubuntu では、必要になることがあります。 ### 2.5.4 切断する `exit` と入力すると切断されます。 ```text taro@ubuntu-server:~$ exit logout Connection to 192.168.139.20 closed. ``` `Connection to … closed.` が、フロントマシン側に戻った合図です。 ここから先は、2.6 に進んでください。 :::{admonition} ブラウザの中で端末を使う方法 :class: note ブラウザだけで端末を使う仕組みも、いくつか公開されています。 代表的なものを挙げます。 - **ttyd**: 手元の端末をブラウザに映す小さなプログラム - **Wetty**: ブラウザから ssh 接続するためのソフト - **Shell In A Box**: 古くからある同種のソフト。Ubuntu のパッケージにもある - **Apache Guacamole**: ssh のほか RDP や VNC もブラウザから扱えるゲートウェイ - **Cockpit**: Ubuntu のサーバ管理画面。端末のページを持つ - **code-server**: ブラウザで動くエディタ。組み込みの端末が使える - クラウド事業者の管理画面(AWS、Google Cloud、Azure など)に付属するブラウザ端末 いずれも、**インターネットに直接さらすと危険です**。 シェルが使えるということは、そのコンピュータを操作できるということです。 使う場合は、通信の暗号化(HTTPS)、認証の追加、接続元の制限を必ず行ってください。 本書はこれらを使いません。 2.3 から 2.5 の方法のほうが、設定が少なく、安全に始められます。 ::: ## 2.6 プロンプトを読む ここからは、どの方法で用意した場合でも共通です。 登場するものを整理しておきます。 手元で文字を打つ窓が **端末アプリ**、その文字を受け取って実行する Ubuntu 側の役目が **シェル** です。 そのシェルが「入力を待っています」と教えてくれる合図が、これから説明する **プロンプト** です。 3つの登場人物の関係は、図2-3のとおりです。 ```{d2} :alt: 手元の端末アプリが打った文字をシェルへ送り、シェルが結果を返し、入力待ちをプロンプトで知らせるという3者の関係の図。 :width: 50% :align: center direction: down app: "端末アプリ\n(手元で文字を打つ窓)" { style.fill: "#f1f3f4" } shell: "シェル\n(Ubuntu 側で受け取って実行する)" { shape: rectangle style.fill: "#e8f0fe" } prompt: "プロンプト\ntaro@ubuntu:~\$" { shape: rectangle style.fill: "#fef7e0" } app -> shell: "打った文字を送る" shell -> app: "結果を返す" shell -> prompt: "入力待ちを知らせる" ``` {.caption-center} 図2-3: 端末アプリ・シェル・プロンプトの関係 Ubuntu に入ると、次のような文字が表示されています。 ```text taro@ubuntu:~$ ``` 分解すると、次の意味になります。 ```text taro@ubuntu:~$ | | |+- 入力を待っている印 | | +-- いまいる場所 | +--------- コンピュータの名前 +-------------- 使っている人の名前 ``` `taro` は、2.3 から 2.5 で使うことになる利用者名です。 `ubuntu` の部分は環境によって変わります。 WSL なら Windows のコンピュータ名、OrbStack ならマシン名、リモート接続ならサーバの名前が入ります。 2.2 で触れたとおり、**本書の画面例では `taro@ubuntu:~$` と表記します**。 読者の画面では、この部分が自分の環境の名前になります。 `~`(チルダ)は **ホームディレクトリ** を表す記号です。 キーボードのどこにあるかは配列によって違います。 見つからないときは「チルダ 入力 Windows」「チルダ 入力 Mac」のように検索してみてください。 その利用者専用の作業場所で、`/home/taro` のような場所にあります。 Ubuntu に入った直後は、たいていここにいます。 OrbStack だけは 2.4.3 のとおり別の場所から始まるので、`cd ~` で移動してください。 `$` の右側にカーソルがあり、ここに文字を打ちます。 本書の画面例では、`$` の右側が入力した文字、その下の行が結果です。 ## 2.7 コマンドを入力する **入力するのは `$` の右側だけです**。 `taro@ubuntu:~$` の部分は端末が表示しているもので、打ち込む必要はありません。 本書の画面例をそのまま写すときは、この点に注意してください。 コマンドを打って `Enter` を押すと、結果が表示され、次のプロンプトが出ます。 試しに2つ打ってみます。 ```text taro@ubuntu:~$ whoami taro taro@ubuntu:~$ date 2026年 9月 7日 月曜日 21:58:16 JST ``` `whoami` は使っている人の名前を、`date` は現在の日時を表示します。 結果が1行返り、またプロンプトが出ました。 これがコマンドの基本の形です。 `date` の表示が日本時間になっていない場合があります。 サーバの時刻設定によるもので、学習には影響しません。 コマンドは、次の3つの部分でできています。 ```text ls -l rpg | | +-- 引数(対象) | +----- オプション(動作の指定) +-------- コマンド名 ``` オプションと引数は、ないこともあります。 `pwd` のように、コマンド名だけで動くものもあります。 打ち間違えたときは、次のように表示されます。 ```text taro@ubuntu:~$ pwdd bash: pwdd: コマンドが見つかりません ``` 「そんな名前のコマンドはない」という意味です。 環境の言語設定によっては `bash: pwdd: command not found` と英語で表示されますが、意味は同じです。 壊れたわけではないので、打ち直せば問題ありません。 エラーが出たら、まずメッセージを読む。 この習慣は、第13章で Python のエラーを読むときにそのまま使います。 ## 2.8 `pwd`で現在地を確認する `pwd` は、いまいる場所を表示します。 print working directory の略です。 ```text taro@ubuntu:~$ pwd /home/taro ``` `/home/taro` が、いまいる場所です。ディレクトリの並びは図2-4のようになっています。 ```{d2} :alt: いちばん上の / の下に home があり、その下に taro(~)があるという階層の図。 :width: 45% :align: center direction: down root: "/(いちばん上)" { style.fill: "#f1f3f4" home: "home" { style.fill: "#f1f3f4" taro: "taro ← いまここ(~)" { style.fill: "#e6f4ea" } } } ``` {.caption-center} 図2-4: `/home/taro` はどこにあるか 先頭の `/` から始まる書き方を **絶対パス** といいます。 どこから見ても同じ場所を指すので、迷ったときの基準になります。 プロンプトの `~` と、`pwd` が表示した `/home/taro` は同じ場所です。 `~` は短い表示、`/home/taro` は正式な表示だと考えてください。 作業していると、自分がどこにいるのかわからなくなることがあります。 そのときは `pwd` を打ちます。 迷ったら現在地を確認する、というだけの話ですが、この一手間がエラーの半分くらいを未然に防ぎます。 ## 2.9 `ls`で一覧を表示する `ls` は、いまいる場所にあるファイルとディレクトリを一覧します。 ```text taro@ubuntu:~$ ls taro@ubuntu:~$ ``` 何も表示されませんでした。 用意したばかりのホームディレクトリには、まだ何もありません。 エラーではなく、「表示するものがない」という結果です。 `-a` を付けると、隠しファイルも表示されます。 ```text taro@ubuntu:~$ ls -a . .. .bash_logout .bashrc .profile ``` 名前が `.` で始まるものが出てきました。 Linux では、名前の先頭が `.` のファイルは、ふだんは表示されません。 設定ファイルを目立たせないための決まりです。 `.bashrc` と `.profile` は、シェルの設定ファイルです。 第4章で uv をインストールしたときに、この `.bashrc` が書き換わります。 先頭にある `.` と `..` は特別で、それぞれ「いまいるディレクトリ」と「ひとつ上のディレクトリ」を指します。 `..` は 2.11 で使います。 `ls -l` と打つと、更新日時や大きさを含む詳しい一覧になります。 中身のあるディレクトリで見たほうがわかりやすいので、第5章でプロジェクトのファイルを作ってから確かめます。 ## 2.10 `mkdir`でディレクトリを作る `mkdir` は、新しいディレクトリを作ります。 make directory の略です。 本書で使う作業場所を、ここで作っておきます。 ```text taro@ubuntu:~$ mkdir rpg taro@ubuntu:~$ ls rpg ``` `rpg` ができました。 `mkdir` は、成功したときは何も表示しません。 Linux のコマンドの多くは、うまくいったときは黙っています。 結果を確かめたいときは `ls` を使います。 この `~/rpg` が、本書を通じての作業場所です。 第5章ではここに Python のプロジェクトを作り、第4部ではここでゲームを組み立てます。 ## 2.11 `cd`で移動する `cd` は、別のディレクトリへ移動します。 change directory の略です。 ```text taro@ubuntu:~$ cd rpg taro@ubuntu:~/rpg$ pwd /home/taro/rpg ``` プロンプトの `~` の部分が `~/rpg` に変わりました。 プロンプトは常に現在地を表示しているので、移動できたかどうかはここでも確認できます。 ひとつ上に戻るには `..` を使います。 ```text taro@ubuntu:~/rpg$ cd .. taro@ubuntu:~$ pwd /home/taro ``` `cd rpg` のように、いまいる場所を基準にした書き方を **相対パス** といいます。 一方、`/` から書く絶対パスなら、どこにいても同じ場所へ移動できます。 ```text taro@ubuntu:~$ cd / taro@ubuntu:/$ pwd / ``` `/` は **ルートディレクトリ** で、すべての出発点です。 ホームディレクトリもこの下にあります。 位置関係は図2-5のとおりです。 ```{d2} :alt: ルート / の下に home・etc・usr が並び、home の下に taro(~)、taro の下に rpg があるディレクトリの木構造。 :width: 60% :align: center direction: down root: "/ (ルート)" home: "home" taro: "taro (= ~)" rpg: "rpg" etc: "etc" usr: "usr" root -> home root -> etc root -> usr home -> taro taro -> rpg ``` {.caption-center} 図2-5: ディレクトリの位置関係 ホームディレクトリに戻りたいときは、引数なしの `cd` で戻れます。 ```text taro@ubuntu:/$ cd taro@ubuntu:~$ pwd /home/taro ``` 存在しない場所を指定すると、移動せずにエラーが出ます。 ```text taro@ubuntu:~$ cd work bash: cd: work: そのようなファイルやディレクトリはありません ``` `work` というディレクトリがないからです。 打ち間違いか、いる場所が想定と違うかのどちらかなので、`pwd` と `ls` で確かめます。 ## 2.12 コマンド履歴とTab補完 打ち込む手間を減らす機能が2つあります。 どちらも打ち間違いを減らしてくれるので、早めに覚えておくと快適です。 ひとつが **コマンド履歴** です。 `↑` を押すと、直前に打ったコマンドが出てきます。 もう一度押すと、その前のコマンドが出ます。 `↓` で戻れます。 同じコマンドをもう一度実行したいときは、`↑` を押して `Enter` です。 もうひとつが **Tab補完** です。 ファイル名やディレクトリ名を途中まで打って `Tab` を押すと、残りを補ってくれます。 ```text taro@ubuntu:~$ cd r ← ここで Tab を押すと taro@ubuntu:~$ cd rpg/ ← こうなる ``` 候補が複数あるときは、1回目の `Tab` では補完されません。 もう一度 `Tab` を押すと、候補の一覧が表示されます。 そこまで打てば候補がひとつに決まる、という位置まで打ってから押すのがこつです。 たとえば `rpg` しかないディレクトリなら、`r` まで打って `Tab` を押すだけで `rpg/` になります。 Tab補完には、打ち間違いを防ぐ効果もあります。 `Tab` を2回押しても候補が出ないなら、その名前のファイルがありません。 実行する前に気付けます。 ## 2.13 `--help`で調べる コマンドの使い方は、コマンド自身に聞けます。 多くのコマンドは `--help` を付けると説明を表示します。 ```text taro@ubuntu:~$ mkdir --help 使用法: mkdir [OPTION]... DIRECTORY... ディレクトリが存在しない場合に、ディレクトリを作成します。 長いオプションで必須となっている引数は短いオプションでも必須です。 -m, --mode=MODE ファイルのパーミッションを a=rwx - umask ではなく (chmod のように) MODE に設定する -p, --parents ディレクトリが存在していてもエラーを返さない。 必要に応じて親ディレクトリを作成する。 ``` 最初の「使用法」の行が、いちばん役に立ちます。 `[OPTION]...` のように角かっこで囲まれた部分は、省略できるという意味です。 `DIRECTORY...` のように囲まれていない部分は、必ず書きます。 `mkdir --help` は20行ほどですが、コマンドによってはもっと長くなります。 `ls --help` は140行を超えるので、画面から流れてしまいます。 そのときは、次のようにすると1画面ずつ表示できます。 ```bash ls --help | less ``` `less` の中では `↓` で進み、`q` で終了します。 英語で表示される場合もあります。 その場合は、必要な部分を AI に貼り付けて聞くのが早道です。 ## 2.14 AIにコマンドを質問する コマンドを調べる方法は、`--help` だけではありません。 AI に聞くこともできます。 AI 開発エージェントの導入は第3章ですが、質問の仕方はここで決めておきます。 聞き方のこつは、**やりたいことと、いまいる場所を書く**ことです。 ```text Ubuntu の端末で作業しています。 いま /home/taro にいます。 rpg というディレクトリの中に、さらに data というディレクトリを作りたいです。 コマンドと、その各部分の意味を教えてください。 ``` 「mkdir の使い方を教えて」と聞くよりも、答えが具体的になります。 やりたいことを書けば、コマンド名を知らなくても質問できます。 返ってきたコマンドは、実行する前に必ず読んでください。 とくに、次の2つが含まれているときは手を止めます。 - `rm`(削除)を含むコマンド - `sudo`(管理者権限で実行)を含むコマンド この2つは、間違えたときの影響が大きいコマンドです。 とくに `rm` には注意してください。 **Linux には、Windows のごみ箱や macOS の「ゴミ箱」にあたる仕組みがありません**。 `rm` で消したファイルは、元に戻せないものと考えてください。 意味がわからないまま実行せず、「このコマンドは何を消しますか」と聞き返してください。 本書で扱う範囲では、`sudo` が必要になる場面はほとんどありません。 必要な箇所は本文で明示します。 ## 2.15 接続を終える・再開する 作業を中断するときは `exit` と入力します。 ```text taro@ubuntu:~$ exit logout ``` ssh でつないでいた場合は、このあとに `Connection to … closed.` が続きます(2.5.4)。 `exit` が何を終わらせるかは、用意した方法によって少し違います。 ```{list-table} 表2-2: 終了と再開 :header-rows: 1 :widths: 20 40 40 * - 方法 - `exit` で起きること - 再開のしかた * - WSL - Windows の画面に戻る - スタートメニューか `wsl` * - OrbStack - macOS のターミナルに戻る - `orb -m rpg` * - ssh - 接続が切れる - `ssh 利用者名@アドレス` ``` どの方法でも、**作ったファイルは消えません**。 消えるのは接続だけです。 再開したときは、たいていホームディレクトリから始まります。 OrbStack のように別の場所から始まることもあるので、`pwd` で確かめてください。 作業の続きをするときは、`cd ~/rpg` で作業場所に戻ります。 いまどこにいるかわからなくなったら `pwd`、何があるかわからなくなったら `ls`。 この2つで、現在地と中身を確かめられます。 `exit` が効かないときは、プログラムが動いている最中かもしれません。 実行中のプログラムを止めるには `Ctrl` + `C` を押します。 2つの役割は違います。 `exit` は「シェルとの接続を終える」コマンドで、`Ctrl` + `C` は「いま動いているプログラムを止める」操作です。 困ったときにいつも `Ctrl` + `C` を押すのではなく、何を止めたいのかで使い分けてください。 プログラムが止まってプロンプトが戻ってきたら、あらためて `exit` と入力してください。 実行中のプログラムがあるときに接続が切れると、そのプログラムも終わります。 長い時間がかかる処理を動かしたまま切断したい場合の方法もありますが、本書の範囲では必要ありません。 ## 2.16 ハンズオン問題 **問題2-1(easy / investigation)作業ディレクトリの中に notes を作る** `~/rpg` の中に `notes` というディレクトリを作り、そこへ移動して、現在地が `/home/taro/rpg/notes` であることを確認してください。 `taro` の部分は、自分の利用者名に読み替えてください。 **実行コマンド** ```bash cd ~/rpg mkdir notes ls cd notes pwd ``` **実行例** ```text taro@ubuntu:~$ cd ~/rpg taro@ubuntu:~/rpg$ mkdir notes taro@ubuntu:~/rpg$ ls notes taro@ubuntu:~/rpg$ cd notes taro@ubuntu:~/rpg/notes$ pwd /home/taro/rpg/notes ``` **ヒント** 1. 始める前に `pwd` で、いまいる場所を確認します。 2. `mkdir` は成功しても何も表示しません。`ls` で確かめます。 3. ホームディレクトリに戻るときは、引数なしの `cd` です。 **AIに依頼する場合** まず自分でコマンドを打ってみてください。 うまくいかないときや、意味を確かめたいときに、次の依頼文を使います。 ```text Ubuntu の端末を使っています。 ホームディレクトリの下の rpg というディレクトリの中に、notes というディレクトリを作りたいです。 作ったあと、そこへ移動して現在地を確認するところまでの手順を、 コマンドを1行ずつ、それぞれの意味を添えて教えてください。 ``` **確認** AI が示したコマンドを、1行ずつ自分で打って確かめてください。 `pwd` の表示が `/home/taro/rpg/notes` になれば正解です。 :::{admonition} 解答と解説 :class: tip ```text taro@ubuntu:~$ cd ~/rpg taro@ubuntu:~/rpg$ mkdir notes taro@ubuntu:~/rpg$ ls notes taro@ubuntu:~/rpg$ cd notes taro@ubuntu:~/rpg/notes$ pwd /home/taro/rpg/notes ``` **解説** `mkdir` は成功したときに何も表示しません。 作れたかどうかは `ls` で確かめます。何も出ないまま次のプロンプトが出たら、それは成功の合図です。 `cd` の結果は、プロンプトでも確認できます。 `~/rpg` から `~/rpg/notes` に変われば移動できています。 `cd ~/rpg` の `~` はホームディレクトリを指すので、この書き方はどこにいても同じ場所へ移動できます。 いまいる場所を基準にする `cd rpg` は、ホームディレクトリにいるときだけ成立します。 迷ったら `~` から書くほうが確実です。 ホームディレクトリに戻るときは、引数なしの `cd` です。 ::: **問題2-2(easy / investigation)ルートディレクトリを見る** ルートディレクトリ(`/`)へ移動し、そこにあるディレクトリの一覧を表示してください。 確認できたら、ホームディレクトリに戻ってください。 **実行コマンド** ```bash cd / ls cd pwd ``` **実行例** ```text taro@ubuntu:~$ cd / taro@ubuntu:/$ ls bin dev home media opt root sbin sys usr boot etc lib mnt proc run srv tmp var taro@ubuntu:/$ cd taro@ubuntu:~$ pwd /home/taro ``` **ヒント** 1. `/` は絶対パスの出発点です。どこにいても `cd /` で移動できます。 2. 一覧に出てくる `home` の下に、自分のホームディレクトリがあります。 3. 戻るときは `cd` だけで十分です。 **確認** 一覧の中に `home` があることを確認してください。 `cd home` と打ってから `ls` を実行すると、自分の利用者名のディレクトリが見つかります。 そこが `~` の正体です。 並ぶ名前は Ubuntu の用意のしかたで少し変わります。 `lib64` のように、ここに出ていない名前が増えることもあります。 `home` があれば問題ありません。 :::{admonition} 解答と解説 :class: tip ```text taro@ubuntu:~$ cd / taro@ubuntu:/$ ls bin dev home media opt root sbin sys usr boot etc lib mnt proc run srv tmp var taro@ubuntu:/$ cd taro@ubuntu:~$ pwd /home/taro ``` **解説** `/` はすべての出発点で、ここから下にすべてのファイルがぶら下がっています。 `home` の下に、利用者ごとのディレクトリがあります。 `cd home` してから `ls` すると、自分の利用者名のディレクトリが見つかります。 そこが `~` の正体です。 ほかの名前は Ubuntu 自身が使う場所です。 `bin` にはコマンドの本体、`etc` には設定ファイルが入っています。 本書の作業では触れないので、中身を覚える必要はありません。 消したり書き換えたりすると Ubuntu が動かなくなるので、見るだけにしてください。 ::: **問題2-3(easy / investigation)接続を切って、つなぎ直す** いったん `exit` で接続を終え、もう一度入り直してください。 入り直したあと、問題2-1で作った `notes` が残っていることを確認します。 **実行コマンド** ```bash exit ``` (再接続したあと) ```bash ls ~/rpg ``` **ヒント** 1. 入り直す方法は、表2-2で自分の環境の行を見てください。 2. 入り直した直後は、たいていホームディレクトリにいます。`pwd` で確かめられます。 3. `ls ~/rpg` のように、移動せずに別の場所を一覧することもできます。 **確認** `notes` が表示されれば、ファイルが接続とは無関係に残ることを確認できました。 第22章では、この性質を使ってゲームの記録を保存します。 :::{admonition} 解答と解説 :class: tip ```text taro@ubuntu:~$ exit logout ``` 入り直したあと、次のように確認します。 ```text taro@ubuntu:~$ ls ~/rpg notes ``` **解説** `exit` で終わるのは接続だけです。 作ったファイルやディレクトリは、そのまま残ります。 入り直したあとは、たいていホームディレクトリから始まります。 OrbStack のように別の場所から始まることもあるので、`pwd` で確かめてください。 作業の続きをするときは `cd ~/rpg` で戻ります。 `ls ~/rpg` のように場所を指定すると、移動せずに一覧できます。 確認だけしたいときは、こちらのほうが手数が少なくなります。 入り直す方法は環境によって違います(表2-2)。 どの方法でも、ファイルが残るという性質は同じです。 第22章では、この性質を使ってゲームの記録をファイルに保存します。 :::