UNIXコマンド入門
なぜUNIXコマンドを学ぶのか
私達がこれから開発するシステムの多くは、開発する環境がWindowsであれ、Macであれ、最終的にはサーバ上で稼働する場面が圧倒的に多いです。 これは大学の研究でも、会社でのシステム開発でも同じことです。 私達が慣れ親しんでいるスマホのゲームも、SNSサービスも、私達のスマホやパソコンが(アプリやブラウザを介して)サーバと情報のやり取りをしています。 そしてそれらのサーバは、UbuntuのようなLinuxベースのOSを使うのが一般的です。 私達が普段パソコンを操作するとき、グラフィカルな画面を見ながらマウスを使って操作しているのとは対象的に、 Linuxベースのサーバでは、CUIを介して操作するのが一般的ですし、(慣れていれば)効率的です。 CUIからの操作は、ターミナルからUNIXコマンドを入力することで行います。 UNIXコマンドによる操作は、1000個のファイルを連番で作るといった操作の自動化や、複雑な操作をコマンドとしてファイルに書き出して保存しておくことで、再現性の担保がしやすいといったメリットがあります。 ここでは、基本的なUNIXコマンドを学ぶことで、私達の書いたプログラムを最終的にLinuxシステム上で動作させるための準備をします。
比較的身近なLinuxサーバの例として次のようなものが挙げられます。
スパコンシステム
京都大学情報学環境機構の提供するスパコンシステムは、Linuxサーバです。実際、マニュアルにはUNIXコマンドの簡単なチュートリアルがあります。
ソーシャルゲーム会社のサーバ構成事情
DeNAのような民間企業では、自社でオンプレミスにサーバを用意したり、AWSのようなクラウドサービスを利用することで、サーバを通じてユーザにサービスを提供しています。これらのサーバも基本的にLinuxサーバです。こうしたサーバをどう構成するかという問題も、ビジネス上重要な課題となることがあります。
事前準備(環境設定)
Macにデフォルトで入っているターミナル (Terminal) アプリを開きましょう。 Spotlightから検索することで起動できます。
Windows Subsystem for Linux (WSL) を利用することで、Windows上でUbuntu20.04を使いましょう。 下記リンクのガイダンスに従って、WSLをインストールして下さい。
学習教材
どちらか一つコースを選択してUNIXコマンドの基本的な操作方法を学んでみましょう。
UNIXコマンド入門 (ドットインストール) の注意点
動画で扱っているOSがAlpineなので少しMacやUbuntuと勝手が違う点があるので注意してください。例えば、 ash
は bash
と読み替えて下さい。
習熟度チェック
絶対パスと相対パス
絶対パスと相対パスの違いを説明できるか確認してみましょう。
ルートディレクトリとホームディレクトリ
ルートディレクトリとホームディレクトリが何かを説明できるか確認してみましょう。
使用頻度の高いコマンド
学習教材で説明されているような、基本的かつ使用頻度の高いコマンドの使い方が分かるか確認してみましょう。
例えば、この文章の著者 (@sotetsuk) の使用頻度の高いコマンドは次の表のようなものでした。
下記表の git
, python
, docker
以外のコマンドがどんなコマンドか分かるか確認しましょう。
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -n 10
順位 | コマンド | 用途 |
---|---|---|
1 | git | Gitを起動する |
2 | ls | ファイルやディレクトリを表示する (list) |
3 | cd | ディレクトリを移る (change directory) |
4 | vi | vimエディタを起動する |
5 | cat | ファイルを表示したり、結合したりする (catenate) |
6 | rm | ファイルやディレクトリを削除する (remove) |
7 | cp | ファイルやディレクトリをコピーする (copy) |
8 | python | Pythonを起動する |
9 | docker | Dockerを起動する |
10 | less | ファイルの内容をスクロール可能な形で表示する |
"使用頻度の高いコマンドを求めるコマンド"
上記の使用頻度の高いコマンドを求める操作自体も、コマンドをパイプで繋げることで実現しています。それぞれのコマンドがどんなコマンドか確認してみましょう。また、パイプの使用方法を確認してみましょう。
その他の使用頻度上位のコマンド
その他、@sotetsukの使用頻度上位のコマンドには次のようなものがありました。知らないコマンドがあったら、どんなコマンドか調べてみましょう。今は使い方を完璧に知らなくても、こんなコマンドがあったな、と覚えていれば必要に応じて使い方を調べて活用することができます。
その他の使用頻度が高かったコマンドリスト
コマンド | 用途 |
---|---|
mkdir | ディレクトリを作る (make directory) |
pwd | 現在いるディレクトリの絶対パスを表示する (print working directory) |
mv | ファイルやディレクトリを移す (move) |
head | ファイルや入力の最初の方の行を表示する |
tail | ファイルや入力の最後の方の行を表示する |
split | ファイルや入力を行毎で小さなファイルに分割する |
cut | ファイルや入力の各行の一部分を切り取る |
which | コマンドの実行プログラムのパスを調べる |
find | ファイルやディレクトリを探す |
grep | ファイルや入力から一致する表現を検索・出力する |
touch | 空ファイルを作ったり、最終変更時刻を更新する |
ssh | 安全に遠隔マシンに接続する (secure shell) |
ping | 遠隔マシンとネットワークが疎通しているか確認する |
curl | データ転送・APIの利用に使われる |
awk | ファイルや入力を柔軟に加工をする |
sed | ファイルや入力に特定の変更を加える (stream editor) |
演習
次の演習問題1から5を解いてみましょう。
使用するテキストエディタ
Linuxでは、CUIを通してテキストファイルを編集するために vim
、emacs
、nano
といったテキストエディタが使われることが多いです。どれでも好きなものを使い方を調べて使いましょう。
「言語処理100本ノック」第2章の問題を解いてみましょう。これらの問題は、特定のUNIXコマンドと同等の動作をするプログラムを実装するのが課題となっていますが、ここではUNIXコマンドを使ってみるだけで十分です。
この演習では、テキストファイルのダウンロードが必要です。 curl
コマンドの使い方を調べてダウンロードしてみましょう。
あるいは、Cドライブなら /mnt/c
経由でWindowsファイルシステムへアクセスすることも可能なので、Windowsでテキストファイルをダウンロードして、それをコピーしてくるという選択肢もあります。
付録
興味のある方は、さらにこれらのレッスンを学習してみてください。