コンテンツにスキップ

Day 2 Phase 0 — シェル操作

著:いなにわうどん(@kyoto_inaniwa)


本フェーズでは,GUI と CUI におけるインタフェースの違い,およびシェルに関して概説したうえで,本資料にて要求される基本的な UNIX コマンドを説明します.

1. はじめに

本章では,GUI と CUI におけるインタフェースの違い,シェル,および UNIX コマンドに関する簡単な説明を行います.

1.1 GUI と CUI

我々が今日使用する Windows,macOS,Linux 等に代表される OS(オペレーションシステム)においては,GUI(グラフィカルユーザインタフェース)と呼ばれる操作体系が広く採用されています.GUI では,画面上にアイコンやテキスト,ボタン等が視覚的に配置され,ユーザはマウス等を用いてそれらをクリックすることにより,コンピュータを操作します.

一方,高度なコンピュータの操作や,プログラムの開発には,CUI(キャラクタユーザインタフェース)が一般に採用されています.CUI では入出力のほとんどをテキストにて表現します.CUI を操作するには数々のコマンドを駆使する必要がありますが,慣れると GUI よりも効率的に操作することが可能となります.

1.2 シェル

コンピュータと対話を行うソフトウェアをシェルと呼びます.シェルはコンピュータとユーザを繋ぐインタフェースとして機能します.したがって,ユーザはシェルを介して様々な入力を与え,プログラムはシェルを介して出力を返します.シェルには CUI にて動作する「コマンドラインシェル」,および GUI にて動作する「グラフィカルシェル」の両者が存在します.ただし,単に「シェル」と呼ぶ場合は,前者を指すことが一般的です.代表的なコマンドラインシェルには sh,bash,zsh,コマンドプロンプト,PowerShell 等が存在します.

2. UNIX コマンド

UNIX コマンドは,UNIX 系 OS にて採用されるコマンドです.ユーザは,このコマンド群を使用することにより,ファイルやシステムを管理,操作したりすることができます.Linux,FreeBSD,macOS 等の UNIX 系 OS においては,これらのコマンドを標準的に使用します.

一方,Windows ではこれらのコマンドの全てを使用することはできません.ただし,Windows においても代替のコマンド(ls コマンドに対する dir コマンド等)が用意されている場合がほとんどであるため,Windows 環境をお使いの場合は「ls コマンド Windows」等で検索を行うことを推奨します.

2.1 表記について

本フェーズにおいて,シェル操作の例を提示する場合,以下の規則に従います.

  • $(プロンプト)から始まる行 — ユーザの入力を表す.ユーザがコマンドを実行する際は,$ を入力する必要はない.
  • その他の行 — コマンドやプログラムによる出力を表す.
  • # 以降の文字列 — コメントを表す.
$ ユーザはこの行を入力する
コマンドプログラムの出力 # これはコメント
コマンドプログラムの出力
# この行もコメント

3. 代表的な UNIX コマンド

本章では,頻繁に使用されるコマンドの一覧を示します.これらを直ちに暗記する必要はありませんが,(特に情報系の分野に進む場合は)必要に応じて,これらのコマンドを適切に使用できるようになることが望ましいです.また,ここに示したもの以外にも,多数のコマンドが存在することにも留意する必要があります.

3.1 pwd

カレントディレクトリ(現在位置しているディレクトリ)の位置を表示します.

$ pwd
/Users/yuto/documents/ipc-jsys-web-training-2024-2

3.2 cd

現在位置しているディレクトリ(Current directory)を変更します.cd は Change Directory の略称です.

$ cd foo # foo に移動
$ cd .. # 親ディレクトリに移動
$ cd ../foo # 親ディレクトリ下の foo に移動
$ cd ../.. # 親の親のディレクトリに移動
$ cd / # ルートディレクトリに移動
$ cd ~ # ホームディレクトリに移動

3.3 ls

指定したディレクトリ内に存在する,ファイルおよびディレクトリの一覧を表示します.-l オプションを付与するとファイルの詳細を,-a オプションを付与すると隠しファイルを含めて表示します.

$ ls # 現在のディレクトリ内のファイルおよびディレクトリ一覧を表示
test.txt
$ ls foo # foo 内の……
$ ls .. # 親ディレクトリ内の……
$ ls -l # ファイルの詳細を表示
.rw-r--r--@ 13k user 8 6 03:05 test.txt
$ ls -a # 隠しファイルを含めて表示
.gitignore test.txt

3.4 mv

指定されたファイルやディレクトリの移動を行います.また,本コマンドは名前の変更(リネーム)の機能も有します.

$ mv foo.txt bar # foo.txt をディレクトリ bar 下に移動
$ mv foo.txt .. # foo.txt を親ディレクトリに移動
$ mv foo.txt bar.txt # foo.txt を bar.txt にリネーム

3.5 cp

指定されたファイルやディレクトリをコピーします.

$ cp foo.txt bar # foo.txt をディレクトリ bar 下にコピー
$ cp foo.txt bar.txt # foo.txt を bar.txt としてコピー

3.6 rm

指定されたファイルやディレクトリを削除します.-r オプションを付与すると,ディレクトリを再帰的に削除します.

$ rm foo.txt # foo.txt を削除
$ rm foo.txt bar.txt # foo.txt, bar.txt を削除
$ rm -r baz # baz ディレクトリと,その中のファイルおよびディレクトリを再帰的に削除

3.7 mkdir

ディレクトリを作成します.

$ mkdir foo # foo ディレクトリを作成する

3.8 cat

標準入力から流れてきたデータを,標準出力に流し込みます.多くの場合,テキストファイルやソースコードの内容を確認するのに用いられます.

$ cat foo.txt # foo.txt を表示

3.9 touch

ファイルのタイムスタンプを,コマンドの実行日時に更新します.存在しないファイルを指定した場合は作成されるため,多くの場合ファイルの新規作成に使用されます.

$ touch foo.txt # foo.txt が存在しない場合,新規作成

3.10 ssh

SSH(Secure Shell)プロトコルを用いて,ネットワーク経由にてリモートマシンに接続します.リモートログインやリモートコマンドの実行に使用されます.

以下は,筑波大学の全学計算機システム(https://www.u.tsukuba.ac.jp/)に接続する例です.接続には公開鍵認証を行う必要があります(詳細は https://www.u.tsukuba.ac.jp/publickey/ を参照).

$ ssh 学籍番号@icho01.u.tsukuba.ac.jp
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-182-generic x86_64)
Last login: Fri Nov 3 03:49:20 2023 from 133.51.172.4

~/.ssh/config に以下の設定が記述されている場合は,$ ssh icho にて全学計算機システムに接続することもできます.

Host icho
HostName icho01.u.tsukuba.ac.jp
User 学籍番号
IdentityFile 秘密鍵のパス

4. 演習問題

最後に,実際にシェルを操作する演習問題を用意しました.ターミナルを開き,Finder やエクスプローラ等の GUI を一切使用せずに,コマンドのみで作業を進めてください.各問題は前の問題の続きになっています.現在地がわからなくなった場合は,pwdls を実行して状況を確認しましょう.

解答例は各問題の下に折りたたんで記載していますが,まずは自分でコマンドを考えて実行し,結果を確認してから開くようにしてください.なお,解答例はあくまで一例であり,同じ結果になれば他の方法でも構いません.

Q1. 作業ディレクトリの準備

ホームディレクトリに移動し,そこに shell-practice という名前のディレクトリを作成して,その中に移動してください.最後に,カレントディレクトリが shell-practice になっていることをコマンドで確認してください.

解答例
$ cd ~ # ホームディレクトリに移動
$ mkdir shell-practice # ディレクトリを作成
$ cd shell-practice # 作成したディレクトリに移動
$ pwd # カレントディレクトリを確認
/Users/yuto/shell-practice

Q2. ディレクトリ構造の構築

shell-practice の中に,以下のディレクトリ構造を作成してください.memo.txt 等のファイルは,中身が空のファイルで構いません.作成後,ls を用いて各ディレクトリの中身が正しいことを確認してください.

shell-practice
├── docs
│ ├── memo.txt
│ └── report.txt
└── src
└── main.ts
解答例
$ mkdir docs src # ディレクトリを 2 つ作成
$ touch docs/memo.txt docs/report.txt # docs 内に空ファイルを作成
$ touch src/main.ts # src 内に空ファイルを作成
$ ls
docs src
$ ls docs
memo.txt report.txt
$ ls src
main.ts

cd docs にて docs 内に移動してから touch memo.txt report.txt を実行しても構いません.その場合は,作業後に cd .. にて shell-practice に戻っておきましょう.

Q3. コピーとリネーム

続いて,以下の 2 つの操作を行ってください.作業後,docs 内が idea.txtreport.txtreport-backup.txt の 3 ファイルになっていることを確認してください.

  1. docs/report.txt を,同じ docs 内に report-backup.txt という名前でコピーする
  2. docs/memo.txtidea.txt にリネームする
解答例
$ cp docs/report.txt docs/report-backup.txt # コピー
$ mv docs/memo.txt docs/idea.txt # リネーム
$ ls docs
idea.txt report-backup.txt report.txt

Q4. 相対パスでの移動

cd src を実行して,カレントディレクトリを src に変更してください.その状態のまま(cd で他のディレクトリに移動せずに),main.tsdocs の中に移動してください.また,カレントディレクトリを src から動かさずに,docs の中身を表示して結果を確認してください.

解答例
$ cd src # カレントディレクトリを src に変更
$ mv main.ts ../docs # 親ディレクトリ下の docs に移動
$ ls ../docs # 親ディレクトリ下の docs の中身を表示
idea.txt main.ts report-backup.txt report.txt

..(親ディレクトリ)を用いると,カレントディレクトリを基準とした相対パスにて,他のディレクトリ内のファイルを操作できます.

Q5. 隠しファイル

shell-practice 直下に戻り,.config という名前のファイルを作成してください.そのうえで,このファイルが ls では表示されず,オプションを付与した場合にのみ表示されることを確認してください.

解答例
$ cd .. # shell-practice に戻る
$ touch .config # 隠しファイルを作成
$ ls # .config は表示されない
docs src
$ ls -a # 隠しファイルを含めて表示
. .. .config docs src

UNIX 系 OS では,. から始まる名前のファイルやディレクトリは「隠しファイル」として扱われます.Git の設定ファイル .gitignore 等,開発では隠しファイルを扱う機会が頻繁にあります.

Q6. 後片付け

ホームディレクトリに戻り,shell-practice ディレクトリを中身ごと削除してください.削除後,ls にて shell-practice が存在しないことを確認してください.

解答例
$ cd ~ # ホームディレクトリに移動
$ rm -r shell-practice # 中身ごと再帰的に削除
$ ls # shell-practice が消えたことを確認

ディレクトリの削除には -r オプションが必要です.オプションを付与せずに rm shell-practice を実行すると,エラーが表示されます.

Q7. 【チャレンジ】検索して解く問題

最後に,本資料では紹介していないコマンドやオプションが必要となる問題です.3 章の冒頭にて述べたとおり,コマンドを暗記するよりも,必要な操作を検索にて探し出せる能力の方が重要です.「ディレクトリ 一括作成 コマンド」のように検索して,解き方を自力で見つけてください.

  1. mkdir1 回だけ実行して,a/b/c という 3 階層のディレクトリを一度に作成してください
  2. 適当なテキストファイルを用意し,そのファイルの行数をコマンドで数えてください
解答例
$ mkdir -p a/b/c # -p オプションで中間のディレクトリも一括作成
$ wc -l foo.txt # ファイルの行数を数える
12 foo.txt

このように,未知の操作であっても,検索を通じて適切なコマンドやオプションに辿り着くことができれば十分です.