UNIX シェルは、UNIX 系のカーネルを採用したコンピュータシステムを操作するための命令である。このようなコンピュータには Linux (Ubuntu, CentOS, Debian, Android など) 、macOS、iOS などがある。UNIX シェルを使うことで、わずか、数回のキー入力で様々な処理をこなすことができる。さらには、同じフォーマットに従った大量のファイルに対する繰り返し作業などを自動化したりするのに役に立つ。溢れかえるビッグデータの時代の中で溺れないために、ぜひ基本的なUNIX シェルを身につけておきたいものである。
人がコンピュータに命令を与えるとき、コンピュータの画面をみながら、キーボード、マウス、タッチパネルや音声認識システムなどを組み合わせて使用している。コンピュータの画面をみながら何らかの命令を与えるという操作は、Graphical User Interface (GUI) を利用した操作などとよばれている。GUI 操作は、直感的で分かりやすいため、現在、多くのシステムに取り入れられている。しかし、この方法は、ビッグデータなどを処理する場合に非効率的である。
例えば、あるディレクトリ(フォルダ)の中に 1,000 件の CSV ファイルがあるとする。これらの CSV ファイルの中に様々な果物の売り上げデータがあるとする。この 1,000 件の CSV ファイルに散らばっているリンゴの売上データを収集したい場合は、ファイルを 1 つ開いで、その内容を確認し、"apple" を含まれている行を探してコピーし、新しいファイルに貼り付ける、という作業を 1,000 回繰り返す必要がある。さらにこの作業を間違いなく行う必要がある。作業は単純だが、多くの作業時間を要する。
一方で、UNIX シェルを利用すると、この集計作業を英語に似た文章で、コンピュータに命令することができる。例えば、1,000 件の CSV ファイルからリンゴのデータを集計する作業は、次のような文字命令を出すことによって、わずか数秒で集計作業を終わらせることができる。
for f in `ls *.csv`; do
grep "apple" ${f} >> apple.csv
done
そして、リンゴではなく、サクランボのデータも収集したい場合は、命令文にある "apple" を "cherry" に変更するだけで行えるようになる。このように、文字のみを使ってコンピュータに命令を与えるという操作は、Character User Interface (CUI) あるいは Command Line Interface (CLI) などと呼ばれている。
CLI 操作用の命令文を学ぶのは、新しい外国語を学ぶのと似ている。語学では、常用単語や文法の概要を数日で確認できるものの、それらをすべて覚えて、実際に使えるようになるには長い年月がかかる。幸にも CLI 操作用の命令文は、単語が数十個のみで、文法も数種類しかない。そのため、CLI 操作の概要を学ぶには数時間だけで十分。また、CLI 操作に慣れ、ある程度自由に使えるようになるためには、数ヶ月の時間を要するかもしれない。やや長い道のりだが、CLI 操作を一度身につければ、今後、多くの時間を節約できるようになる。
CLI 操作用の命令はシェルを使う。シェルは、コンピュータに命令を出す「コマンド」と、そのコマンドを制御するための「シェル」からなる。例えば、コマンドは、ファイルをコピーしたり、ファイルの内容を検索したりするような、コンピュータに具体的な動作を行わせる命令のことである。シェルは、コマンドの実行順序や実行回数などを制御するために使用する。例えば、「ファイルのコピーを 10 回繰り返す」という動作をコンピュータに行わせたい場合、シェルでコピーコマンドを 10 回繰り返すように制御する。次項からコマンドやシェルの解説に必要な実行環境やデータの準備についてまず説明する。そのあとに、コマンドやシェルを説明していく。
シェルは基本的に macOS や Linux (Ubuntu, Debian など) の UNIX 系のコンピュータ上で実行できるものである。macOS あるいは Linux を使用している場合は、「ターミナル(端末)」を起動して使う。ユーザー名に空白が含まれている場合、一部のコマンド操作を正しく実行できないため、練習用に空白を含まないユーザーを作成して、それを使用することをおすすめする。
Windows を使用している場合は、Windows に Linux 環境を導入する必要がある。Windows 10 ならば、Windows Subsystem for Linux (WSL) を利用して、Ubuntu をインストールするのが手軽である。ウェブ記事などを参考にして Ubuntu をインストールしてください。また、Ubuntu のユーザーアカウントを作成する際に、ユーザー名に空白を含まないように注意してください。
実行環境の準備し終えたら、サンプル用のデータをダウンロードしてくる。macOS および Linux ユーザーはターミナルを起動してください。Windows ユーザーは WSL 上の Ubuntu を起動してください。ターミナルを起動してから、次のコマンドを一行ずつターミナルにコピーして、Enter/Return キーを押してください。手入力の場合、タイポが入りやすいので、なるべくコピー&ペーストで対応してください。
xxxxxxxxxx
cd
wget https://aabbdd.jp/unix4bi/unix4bi.tar.gz
tar xzvf unix4bi.tar.gz
この 3 行のコマンド(コード)を実行した後、ターミナルをそのままにしてください。以下の練習で、続けてこのターミナルを使用する。なお、この時点で、データはすでにダウンロード済みであるので、ターミナルあるいはパソコンを再起動しても上のコマンドを再実行する必要はない。
UINX ではフォルダのことをディレクトリとよぶ。厳密にはフォルダとディレクトリは異なる概念だが、同じものと考えて差し支えない。UNIX ではディレクトリをツリー構造で管理している。ツリー構造の根の部分をルートとよぶ。すべてのディレクトリおよびフォルダがこのルートからたどり着くことができる。ルートの下に "bin"、"etc"、"var" などのディレクトリがある。これらのディレクトリにはシステムに必要なプログラムやライブラリーが保存されている。一般ユーザーはこれらのディレクトリの中にファイルを保存したりすることができない。
一般ユーザーが自由に使えるディレクトリをホームディレクトリと呼ぶ。ホームディレクトリはルートディレクトリ "/" の下の "home" ディレクトリに含まれている。上の例であれば、frank とよばれるユーザーのホームディレクトリは、"home" ディレクトリの下の "frank" ディレクトリになる。frank ユーザーはこの "frank" ディレクトリを自由に利用できる。
コンピュータ上には無数のディレクトリやファイルが置かれている。それぞれのディレクトリやファイルには住所のようなものがあり、これをパスと呼ぶ。パスを正確に記述すれば、そのパス(住所)に存在するディレクトリあるいはファイルにたどり着くことができる。例えば、frank ユーザーのホームディレクトリのパスは、ルート "/" から順に辿って、次のように記述できる。
xxxxxxxxxx
/home/frank
また、frank ユーザーが持っている小麦のゲノムデータ(genome.fa) を見ると、そのデータは "frank" ホームディレクトリの下にある "projects" ディレクトリの下にある "wheat" ディレクトリに入っている。このとき、この genome.fa ファイルのパスは、次のように記述される。
xxxxxxxxxx
/home/frank/projects/wheat/geonme.fa
ツリー構造のルート "/" から書き始めるパスのことを絶対パスと呼ぶ。現実世界の話をすると、外国の研究機関などに手紙などを郵送するときは絶対パスで書くことが多い。つまり、国名から部屋番号まですべてを書く必要がある。
絶対パスのほかに相対パスという概念もある。例えば、同じ組織にいる研究者にメモを渡すときは、「東側の研究棟の 304 室」などのような表現を使うことが多い。このような、自分の居場所を基準として、相対的に見た相手の住所のことを相対パスと呼ぶ。絶対パスとは異なり、相対パスは実例を用いたほうが説明しやすいため、ここでは説明を省略する。