ターミナルからの操作

情報リテラシ第一 / 情報リテラシ第二

グラフィカルユーザインタフェイスと文字型のインタフェイス

グラフィカルユーザインタフェイス(Graphical User Interface;略してGUI)とは1970年初頭に提案されたデスクトップメタファ(机の上での事務作業のなぞらえたもの)です。実際の事務作業においては、机上にさまざまな書類が散乱しがちです。それをフォルダやバインダーに挟んで整理し、それを引き出しや整理戸棚がそろったオフィス家具に収納することで事務の効率を向上しています。これに倣ってデジタルデータにファイルのアイコンという見掛けを与えるファイルのメタファ、ファイルに保存された情報を束ねるフォルダのメタファを通してコンピュータの上でも効率的に情報を整理する方式がグラフィカルユーザインタフェイスの一面です。

グラフィカルユーザインタフェイスの実現のために、ビットマップディスプレイとマウスに代表されるポインティングデバイスが考案されました。

では、70年代以前のコンピュータはどうだったのかというと、もちろんファイルやフォルダに類する概念はあったのですが、それが絵として見えるようにはなってませんでした。だいたいどんな感じかというと

昔はコマンドを使ってコンピュータを操作したものです
昔はコマンドを使ってコンピュータを操作したものです

昔のコンピュータには絵をきれいに表示するのに不可欠な高解像度ディスプレイもその上でユーザの意図を指し示すためのマウスもなかったので、なにからなにまでキーボードを利用してコンピュータに指示をだしていたのです。このような昔風のコンピュータとの対話の仕方のことを文字型のインタフェイスと呼ぶことがあります。

「なにそれ、文字型のインタフェイスって、50年も昔のことを言っているの?そんなの今どき、使うわけないでしょ。なんのアナクロ。もしかして罰ゲーム?」とか言いたくなる気持ちはわかりますけれど、CUIは今もプロフェッショナルな世界では厳然と利用され続けています。そして、ときとして現代的なGUIよりも遥かに効率的に仕事を進めることができます。それが回顧主義でも、罰ゲームでもなく、この授業でCUIを取り上げる理由です。

CUIを用いることで以下のようなことがあっという間に遂行できます。

  1. 100個のセンサーから毎時送られるデータがあったとします。これを金曜の晩に、整理するのがあなたの仕事です。一週間で100 * 24 * 7 = 16,800個のファイルがあるので人間技とも思えません。手作業でやっていては間違いも起きやすいですし、土曜日のデートも望むべくもありません。

    センサーごとのフォルダにきれいに分類するのはCUIを用いればあっという間なのに。。。

  2. 上司がこともなげに月曜日までにセンサーごとにデータを集計してグラフにまとめるように指示を出しました。上の例では各センサーは、一週間で24*7=168個のデータを送ってきます。これを手作業で折れ線グラフにした画像ファイルを各センサーごとに作成するんですか。これで日曜日の予定もパーです。

    CUIを用いれば、これもあっという間なのに。。。

  3. 今度は研究所長からの急な依頼です。昨晩、明らかになったセンサーの異常に関して、研究所に急な取材があるので100個のセンサーからやってくるデータを2時間以内に統合してグラフにまとめて欲しいと言ってます。完全な無理ゲー!

    CUIを知っているか否かが、あなたの研究者生命を左右することもあるんです。大したことはないから、早いうちに親しんでおくと安心ですよ。

CUIを用いるもうひとつの恩恵は、遠隔のコンピュータのアクセスが容易な点です。遠隔のコンピュータなんて操作しないと思うかもしれませんけれども、自然科学の大規模共同研究、生命科学のゲノム情報の解析、工学分野や社会システムのシミュレーションでビッグデータを扱うことは普通のことになっています。そのビッグデータを扱うために遠隔の強力なコンピュータの利用は不可欠です。この点からもCUIが利用できることは専門分野においてあなたのプレゼンスを差別化するポイントになります。

ターミナル - CUI のためのアプリケーション

Macのユーティリティにターミナルと呼ばれるものがあります。CUIを用いるときはターミナルを立ち上げて、そこに適切なコマンドを入力することによって操作を行います。

ちょっと嬉しいコマンド:その1 - calコマンド

calコマンドを試してみましょう。

calコマンドの実行結果
calコマンドの実行結果

calコマンドはこの月のカレンダーを表示します。(この部分は2018年の6月に書かれたのでこのような表示になっていますが、みなさんの手元では違う年月のカレンダーが表示されているはずです。)

ターミナルで利用できるコマンドは、今のcalコマンドのように単純に実行するだけでなく、しばしばコマンド名に続けて引数(ひきすう)を与えることがあります。たとえば、calコマンドに2018という引数を与えてcal 2018を実行してみましょう。

cal 2018コマンドの実行結果
cal 2018コマンドの実行結果

今度は年間カレンダーを表示できました。

calコマンドはさらに二つの引数をとることができます。最初の引数が月、残りが西暦にあたります。この機能を使えば、あなたが生まれた月のカレンダーを眺めることができますよ。

cal 7 2018コマンドの実行結果
cal 7 2018コマンドの実行結果

オマケ(なんじゃこりゃ?)

cal 9 1752コマンドの実行結果
cal 9 1752コマンドの実行結果

西暦1752年にそれまで利用していたユリウス暦から、グレゴリウス暦に以降することで長年にわたって閏年を無視してきたつけを開放したんですが、こんな無茶なことをやったんですね。

ここまでのまとめ

ちょっと嬉しいコマンド:その2 - bcコマンド

実行してちょっと嬉しいコマンドの例の第三弾としてbcコマンドを紹介します。このコマンドは簡易電卓のコマンドです。calコマンドはカレンダーを表示したらすぐに終りました。一方、bcコマンドは電卓で計算するための数式を計算し続けます。quitを受け取るまではbcコマンドはひたすら、あなたの忠実な計算機として働きます。

$  bc -l
10^8
100000000
sqrt(2)
1.41421356237309504880
c(5)^2 + s(5)^2
.99999999999999999998
e(0)
1.00000000000000000000
e(1)
2.71828182845904523536
l(e(5))
4.99999999999999999999
quit

bc (basic calculator)は簡易電卓です。bcコマンドを実行するときに,上の例のように-l引数を指定するといくつかの関数が利用できるようになります。案外便利です。

関数の名前 役割
sqrt(x) 平方根
c(x) cos
s(x) sin
e(x) exp (指数関数)
l(x) log (対数関数)

前述のとおり、上の例の最後にあるquitは電卓の終了を指示しています。

ファイルを操作するためのコマンド

ファイルの名前の変更、複製、コピー、ペーストは簡単です。いくつかの方法があります。

ファイルの操作 コマンド 使用例とコマンド使用の意図
名前の変更 mv A B mv output.data 2016-06-25-xray-ab.csv

output.dataという名称では後々、混乱しないようにファイル名に日付と実験内容を記録することにした。
複製 cp A A' cp IMG01234.JPG 2016-06-25-telescope.jpg

デジカメから取り込んだ望遠鏡の写真に日付と内容がわかるように名前をつけた
削除 rm A rm IMG01234.JPG

不要になったファイルをいつまでも残しておくと混乱するので、明らかに無駄なファイルは削除しておく。いったんrmコマンドを実行して削除したデータは復元できないので、十分に気をつけて実行すること。
コピー pbcopy < A pbcopy < page1999-pagerank.pdf
今はGoogleの社長になっているPageとBrinが書いた博士論文をコピーする
ペースト pbpaste > B pbpaste > google-paper.pdf
コピーされた内容を pbpaste するとコピーした内容が google-paper.pdf という名前のファイルで保存される
テキストファイルの内容の表示 cat A cat fig5.plot
fig5.plot という名前のテキストファイルの内容を確認するために表示する.
指定されたファイルがテキストファイルでない場合は謎の記号の羅列を見せられて焦る.指定されたファイルが巨大で,たとえば,何万行もあるとそれらすべてを表示する間,なにもできないので泣きたくなる.

ファイルをアプリケーションで開くためのコマンド

ターミナルでCUI環境を利用しているときでも、画像を見たくなったり、ワープロを起動したくなることはあります。そんなときに、openコマンドは便利です。基本的にはopen -a アプリ名 ファイル名で指定したファイルを指定したアプリケーションで開くことができます。

操作 コマンド 使用例とコマンド使用の意図
JPEG画像を開く open A.jpg open 2016-06-25-telescope.jpg
標準の画像ビューアのプレビューが写真を表示する
PDF文書を開く open A.pdf open google-paper.pdf
標準のPDFビューアのAdobe Acrobatが文書を表示する
PDF文書をプレビューで開く open -a preview A.pdf open -a preview google-paper.pdf
Adobe AcrobatではなくプレビューでPDFファイルを開く
テキストファイルを開く open A.txt open memo.txt
すでにmemo.txtというファイルが存在するときに、このコマンドを実行すると、標準のテキストエディタでこのファイルを開く。まっさらなMacの場合、標準のテキストエディタはテキストエディットなので、文字化けを生じる可能性がある
テキストファイルを指定したテキストエディタで開く open -a T A.txt open -a coteditor memo.txt
CotEditor を使ってテキストファイルを開く。他のテキストエディタを用いる方法は後述のとおり。
フォルダを表示する open DIR open . 作業ディレクトリに対応するフォルダを Finder で表示する.(. の意味と作業ディレクトリについては後述)
open Desktop 作業ディレクトリに含まれる Desktop という名前に対応するフォルダを Finder で表示する.

ディレクトリとその構造、そしてパス

ディレクトリとはCUIの世界でフォルダを意味するものと思って下さい.GUIの世界におけるファイルとフォルダとCUIの世界におけるファイルとディレクトリは概ね似たようなものです.GUIの世界のフォルダに親子関係があるようにディレクトリにも親子関係があります.GUIの世界では,子フォルダを開くときは子フォルダをクリックしたりダブルクリックしました.CUIの世界で子フォルダを参照するときには,/, .., ~, . などといった記号を用いた独特な記法を使います.

Finderを使っているときには,Finderのウィンドウに現在,見ているフォルダの情報としてファイルのリストが表示されます.この「現在,見ているフォルダ」を,CUIの世界では作業ディレクトリと言います.作業ディレクトリがホームディレクトリのときに,あるファイル名を指示すると,それはホームディレクトリに含まれているファイルを意味します.ほかのディレクトリに同名のファイルがあるかもしれませんが,そちらではなく,ホームディレクトリにあるものを指します.CUIの世界では,作業ディレクトリを基準としたパスという記法によって,操作対象のファイルを指定します.

Finderで新しいウィンドウを開くとたぶんホームフォルダが開くと思います.同様に,ターミナルの新しいウィンドウを開くと,その時点での作業ディレクトリはホームディレクトリ(ホームフォルダに対応したディレクトリ)です.ここで ls コマンドという,ディレクトリが含んでいるファイルのリストを表示するためのコマンドを実行すると,ホームディレクトリに含まれるファイルやディレクトリが表示されます.以下は私のノートパソコンで実行した結果です.

Applications
Desktop
Documents
Downloads
Dropbox (smartnova)
Dropbox (個人)
Software
Library
Movies
Music
Pictures
Public
VirtualBox VMs
anaconda3
bin
projects
tmp
var

Finderの表示と見比べると微妙な違いに気づくかと思います.まず,Finderにはダウンロード,パブリック,ピクチャ,ミュージック,ムービー,文書というフォルダが表示されますが,lsコマンドが表示したファイルには表示されません.でも,よくよく見てみると英語名で対応するディレクトリがあります.

Finderに表示されるフォルダの名前 lsが表示するディレクトリの名前
ダウンロード Downloads
パブリック Public
ピクチャ Pictures
ミュージック Music
ムービー Movie
文書 Documents
アプリケーション Applications
ユーティリティ Utilities
ライブラリ Libraries

実は,MacOSにおける標準的なフォルダの実体の名前は英語名なんです.でも,システムの言語環境を英語以外に設定すると,その本当の名前はFinderの上では隠されて,各国語に翻訳されたものが表示されます.逆にターミナルを使っているときは,翻訳される前の英語名が表示されます.

もうひとつの違いは,ファイルの表示順です.基本的にはどちらもアルファベット順なのですが,ターミナルでは大文字で始まるファイル名に続いて小文字で始まるファイル名が表示されます.一方,Finderでは大文字と小文字の区別はせずにアルファベット順となっています.

MacやWindowsのように異なる言語圏の人々が共通に利用しているシステムの場合,どこかで翻訳されていない生の姿が見えたりするものです.これを機会に翻訳という便利な仕組みを享受しつつ,翻訳の皮がはがれたときに必要以上に驚かないでいたいものです.

さて,ターミナルでファイルのありかを指し示すときには / という記号を用います.この記号の意味は「〜という名前のディレクトリのなかにある」と解釈できます.たとえば,il2a-data/he1/time-join.dat という記述は,「il2a-dataという名前のディレクトリのなかにある,he1という名前のディレクトリのなかにある,time-join.datという名前のファイル」と解釈できます.

ファイルのありかを指し示すのに用いる記号には/のほかにもいくつかあります.以下に紹介します.

記号 記号の意味
ファイル名 作業ディレクトリにあるファイル 作業ディレクトリにtime-join.dataというファイルがあったとき,time-join.dataという名前はそのファイルを指し示します.
/ ルートディレクトリ /
/A ルートディレクトリ直下のAディレクトリ /Applications
/A/B /Aディレクトリの子供のBディレクトリ /Applications/Utilities
.. 作業ディレクトリの親ディレクトリ 作業ディレクトリが /Users/wakita/work/il2a-data/he1 のとき,../Users/wakita/work/il2a-dataを指し示します.
../.. 作業ディレクトリの親の親 作業ディレクトリが /Users/wakita/work/il2a-data/he1 のとき,../Users/wakita/workを指し示します.
~ ホームディレクトリ ~はあなたのホームディレクトリを指し示します.
. 作業ディレクトリ ./

ディレクトリの操作に用いるコマンド

作業ディレクトリにかかわる操作

以下のようなフォルダの構造があることにしましょう。このフォルダ構造の上のあちこちに作業ディレクトリを変更しながら作業することを想定したコマンドを紹介します。基本的にはcdコマンドしか使わないのですが、使い方によってフォルダ階層のさまざまなフォルダに簡単に移動できることがわかります。

work/il2a-data/plot
work/il2a-data/plot
操作 コマンド 使用例とコマンド使用の意図
ここはどこ? pwd Print working directory; 今、作業しているディレクトリのパスを表示
ホームディレクトリに戻る cd 迷子になって困ったら、ひとまずホームに戻る
作業ディレクトリをホームにする cd ~ ~はホームディレクトリの省略記法です。ですので、このコマンドは作業ディレクトリをホームにすることにあたります。
子供のディレクトリに移動 cd D cd plot
作業ディレクトリが/Users/wakita/work/il2a-dataだとしたら、実行後の作業場所は/Users/wakita/work/il2a-data/plotになる。
親のディレクトリに移動 cd .. 作業場所を親ディレクトリにする。作業ディレクトリが/Users/wakita/work/il2a-data/plotだとしたら、実行後の作業場所は/Users/wakita/work/il2a-dataになる。
親の親のディレクトリに移動 cd ../.. 作業場所を親の親ディレクトリにする。作業ディレクトリが/Users/wakita/work/il2a-data/plotだとしたら、実行後の作業場所は/Users/wakita/workになる。
兄弟のディレクトリに移動 cd ../A cd ../he1
作業場所を兄弟ディレクトリにする。作業ディレクトリが/Users/wakita/work/il2a-data/plotだとしたら、実行後の作業場所は/Users/wakita/work/il2a-data/he1になる。

ファイルを別のディレクトリに移動するための操作

移動のためのコマンド
mv image.png .. 作業ディレクトリにあるimage.pngという名前の画像を親ディレクトリに移動します.
mv ./image.png .. 上のコマンドと同じです../を用いることで「ここにある」を強調しているんでしょうか
mv ../image.png . 作業ディレクトリの親ディレクトリにあるimage.pngという名前の画像ファイルを作業ディレクトリ(.)に移動します.
mv image.png ../new-image.png 作業ディレクトリにあるimage.pngという名前の画像ファイルを親ディレクトリにnew-image.pngという名前に変えつつ移動します.

ファイルだけでなくディレクトリを移動するときもmvコマンドを使います.ディレクトリを移動すると,ディレクトリが含んでいるファイルやディレクトリも一緒に移動します. 便利な機能ですけれども,うっかりするとディレクトリ構造が思いがけずに壊れてしまいますから慎重に作業しましょう.mvコマンドの使い方はファイルの移動に用いた方法と一緒なので,説明は省略します.

ディレクトリ構造を変更するための操作

操作 コマンド 使用例とコマンド使用の意図
作成 mkdir D mkdir data
作業ディレクトリには,まだ data という名前のディレクトリが存在していないとしよう.このときこのコマンドを実行すると,サブディレクトリとして dataが作成される.
mkdir data/xray
作業ディレクトリには,dataディレクトリが存在するけれど,まだdata/xrayディレクトリは存在しないときにこのコマンドを実行するとdataディレクトリのサブディレクトリとしてxrayディレクトリが作成されます.
ディレクトリ階層の作成 mkdir -p D/E/F mkdir -p data/xray
作業ディレクトリにはdataがないとき,したがってdata/xrayサブディレクトリもないときに,mkdirコマンドの-pオプションを用いると,これら二つのディレクトリを一気に作成できます.
名前の変更 mv D1 D2 mv data xray-data
作業ディレクトリにdataディレクトリがあって,xray-dataというディレクトリが存在しないとき,dataディレクトリの名称をxray-dataに変更します.
mv xray-data data/xray
作業ディレクトリがdataサブディレクトリとxray-dataサブディレクトリをともに持つときに,後者をxrayという名前でdataのサブディレクトリにする.
削除 rm -rf D rm -rf temporary
作業ディレクトリがtemporaryサブディレクトリを含むときに, そのサブディレクトリに保存されているすべてのファイルとも丸っと削除する.使い方を間違えるととても悲しいことになります.
rmdir temporaryはディレクトリ内にサブディレクトリやファイルがあるときはエラーが出ます.
移動 mv D1 D2 mv xray-data data
作業ディレクトリにふたつのサブディレクトリxray-datadataがあるときに,前者を後者のサブディレクトリに移動します.
複製 cp -r D1 D2 cp -r data/xray backup/xray/2017-06-14
作業ディレクトリにdata/xrayサブディレクトリが存在するときに,それそのサブディレクトリが抱えているすべてのファイルとも丸っと複製して,backup/xray/2017-06-14という名前のサブディレクトリとして保存します.

コマンドを覚えきれない人が無理にコマンドを使うと,ディレクトリを丸ごと削除してしまうかもしれません.Finderからの作業の場合は,編集メニューを使って,作業のやりなおしができますけれども,コマンドのやりなおしはできません.不慣れなうちは,ディレクトリの操作にはFinderを用いるのが懸命かもしれません.この場合,前述の open . コマンドが便利です.