Ruby on Rails チュートリアル
コマンドライン
Unixのコマンドライン操作を
学ぶチュートリアル
第2章基礎
SF作家ニール・スティーヴンスンがいみじくも言ったように「最初に学ぶのはコマンドライン」なのです。コンピューターはGUIのおかげで劇的にシンプルに使えるようになりましたが、多くの場合コンピューターと柔軟にやりとりできる強力なインターフェイスは今でも「command-line interface(CLI)」です。映画「トロン」で言うところのユーザーは、このインターフェイスでコマンドをいくつも入力して、望みのタスクをコンピューターに実行させます。これらのコマンドは実にさまざまな方法で組み合わせることができ、その組み合わせに応じてこれまた実にさまざまな結果を得られます。コマンドラインで使われる典型的なコマンドの例を図 2.1に示します。
本チュートリアルではUnixコマンドラインの基礎を扱います。ここで言うUnixは、LinuxやiOS(iPhoneやiPad)やmacOSなどのオペレーティングシステム(OS)の一族を指します。Unixシステムは、世界中のデスクトップコンピューターはもちろん、WWW(World Wide Web)やモバイル端末やタブレット上で使われているほとんどのシステムをも支えています。Unixは現代のコンピューティングで中心的な役割を果たしているので、本チュートリアルではUnix流のソフトウェア開発手法を取り扱います。例外的にWindowsはUnixの伝統を踏まえていませんが、Windowsネイティブのソフトウェア開発ツールを使う上で、Unixコマンドラインで学んだことの多くが役に立ちます。特に、Unixサーバーにコマンドを発行する必要のある場面1では、Unixコマンドに慣れ親しんでおくことが必須です。そのためWindowsユーザーは、Linuxをインストールするか、Cloud9などのcloud IDE2を使うことをおすすめします。使用方法については「Learn Enough Dev Environment to Be Dangerous」をご参照ください。
2.1 ターミナルを起動する
コマンドラインでコマンドを実行するには、まずターミナルを起動する必要があります。ターミナルはコマンドラインを表示するプログラムです。起動する方法は、お使いのOSによって異なります。
macOS
macOSの場合はSpotlightというmacOSアプリでターミナルウィンドウを開くことができます。「⌘␣」(コマンドキーとスペースキー)を押すか画面右上の虫眼鏡アイコンをクリックし、Spotlightが起動したら検索バーに「terminal」と入力するとターミナルを起動できます(もっと高度でカスタマイズしやすいターミナルプログラムを使ってみたい方にはiTerm2をおすすめしますが、必須ではありません)。
Linux
Linuxの場合は、図 2.2で示したターミナルアイコンをクリックして起動できます。表示結果は図 2.3のようになるはずですが、システムによって細かな表示の違いがあります。
Windows
Windowsの場合、Learn Enough Dev Environment to Be Dangerous」のWindowsセクションで説明されているように、Linuxをインストールすることを推奨します。インストールしたら、図 2.2のターミナルアイコンを探す必要があります。行き詰まった場合は、コラム 2.3の「熟練」を発揮してみるチャンスです。たとえばChromebookでターミナルを開く方法を調べるには、「how to get a command line on a chromebook」などとググってみましょう。
ターミナルウィンドウ
どのOSを使っていても、ターミナル・ウィンドウは図 2.3のようになっているはずですが、システムによって細かな表示の違いがあります。
図 2.1の例には、コマンドで使われる典型的な要素がすべて盛り込まれています。図 2.4に示したように、プロンプト(prompt)の次にコマンド(command)(ここでコンピューターにコマンドを渡す)、オプション(option)(別のオプションを渡す場合に使う)3、 引数(argument)(数学で言う関数の引数に相当)が渡されます。プロンプトはターミナルによって自動生成されることを理解しておきましょう。入力する必要はありません。プロンプトまで入力すればおそらくエラーになるでしょう。さらに、プロンプトは状況によって変わるものなので、本チュートリアルでは重要な目的ではありません(コラム 2.1)。
コマンドラインの先頭には必ず「プロンプト」と呼ばれる1つ以上の記号が表示され、コマンドを入力してもよい状態であることを示します。プロンプトはドル記号「$
」で終わることが多く、システムによってはその前に追加情報を表示します。たとえば、システムによっては以下のようなプロンプトもあります。
Michael's MacBook Air:~ mhartl $
図 2.3では以下のように表示されています。
[~]$
図 2.4では以下のように表示されています。
[projects]$
最後に、現在の私には以下のプロンプトが表示されています。
[learn_enough_command_line (master)]$
プロンプト表示の詳細について、本チュートリアルではこれ以上詳しく触れませんが、次のチュートリアル『テキストエディタ編』では、プロンプトを使いやすいようにカスタマイズする方法をご説明する予定です。
2.1.1 演習
『コマンドライン編』には多くの演習があります。次のセクションに進む前に、必ずこれらの課題に取り組む習慣を付けることを強くおすすめします。演習は本編で扱った課題をカバーしており、さまざまなコマンドを実際に動かすことで本当に身に付くようになります。演習は一般に先に進むうえで必須ではないので、もし難しく感じた場合は、ひとまず飛ばして先に進み、後から演習をやり直すのもオススメです。これは本編を進めるうえでもよいアドバイスとなります。初めてやったときにはとてもできそうもない厄介な問題と思えたものが、後で立ち戻ってみると一瞬でできてしまう経験を何度となくすることにきっと驚くでしょう。
- 図 2.4を見ながら、図 2.5の行ごとにどの部分がプロンプト/コマンド/オプション/引数/カーソルであるかを見分けましょう。
- 現代のターミナルプログラムのほとんどはタブを複数使える(図 2.6)ので、関連するターミナルウィンドウを1つにまとめておくのに便利です4。そこで、ターミナルプログラムのメニュー項目で新しいタブの作成方法を調べましょう(図 2.7)。
自由課題: タブを作成するキーボードショートカットを調べましょう。キーボードショートカットを覚えておくと、とても役に立ちます。
2.2 初めて入力するコマンド
ついに最初のコマンドを実行する準備が整いました。最初のコマンドでは、「hello」という文字を画面に表示しましょう5。さて、ここで入力するコマンドはecho
です。出力したい文字は引数で指定します。この文字のことを文字列と簡潔に表すこともあります。echo
コマンドを実行するには、画面のプロンプトの後ろにecho hello
と入力し、Returnキー(Enterキーとも呼ばれます)を押します。今後このようなコマンドはコピペするのではなく自分で入力することで、より多くのことを学べるでしょう。
$ echo hello
hello
$
echo hello
と入力すると、“hello”と出力されて次のプロンプトが表示されます。なお、簡潔にするため、プロンプトではドル記号 $
以外の文字は省略してある点に注意してください。
今度は次のecho
コマンドを入力してみましょう。
$ echo "goodbye"
goodbye
$ echo 'goodbye'
goodbye
$
ここでご注目いただきたいのは、“goodbye”という単語を引用符で囲んでいることです。上のように、二重引用符(ダブルクォート)"goodbye"
で囲むことも、一重引用符(シングルクォート)'goodbye'
で囲むこともできます。このような引用符で文字列の見た目をグループ化することもできますが、echo
コマンドでは多くの場合引用符なしでも構いません(リスト 2.1)6。
$ echo hello, goodbye
hello, goodbye
$ echo "hello, goodbye"
hello, goodbye
$
なお、引用符をうっかり閉じ忘れてしまうと、以下のようなことが起きます。
$ echo "hello, goodbye
>
どうも困ったことになった雰囲気です。この手の状況から脱するための方法はいろいろあります(実を言えば、この場合は閉じ引用符をさらに1つ入力してReturnキーを押して回復することもできます)が、トラブルが起きたときに使える一般的な脱出戦略を知っておくとよいでしょう(図 2.8)7。その戦略とはすなわち「Ctrl-C」です(コラム 2.2)。
コマンドラインを使っていると、ターミナルが固まるなどして、コマンドが入力しづらくなったり入力不能になってしまうトラブルに度々遭遇します。そういう事態を引き起こしがちなコマンド例を以下にご紹介します。
$ echo "hello
$ grep foobar
$ yes
$ tail
$ cat
実はどの場合も脱出方法は同じで、キーボードでCtrl-C
(「コントロール・シー」と読みます)を押せばよいのです。Ctrl
は「コントロール(control)」キーのことで、C
は「C」のキーのことです。そしてCtrl-C
とは「controlキーを押しながら、Cのキーを押す」という意味です。ただしC
はいわゆる大文字のCのことではありませんので、Ctrlキーの他にわざわざShiftキーまで押す必要はありません8。Ctrl-C
を押すと、次のように⌃C
と出力されることがあります。
$ tail ^C
Ctrl-C
の起源はよくわかっていませんが、私は「キャンセル(cancel)」のCだと思うことにしています。しかしこれだけはぜひ覚えておいてください。コマンドラインで何か困ったことがあったときは、迷わずCtrl-C
を押せばたいてい解決できます。
ちなみに、Ctrl-C
でうまくいかない場合は、ESC
(エスケープ)キーで何とかなることが多いです。
2.3 Manページ
コマンドラインを実行するために今私たちが使っているプログラムは、技術的にはシェル(shell)という名前で知られています9。シェルには、私たちがさまざまなコマンドを学ぶ上で役立つ、ある強力な(かつ謎の記法に満ちた)ツールが含まれています。そのツールはman
(manualの略)と呼ばれ、それ自身がコマンドラインのコマンドの1つです。知りたいコマンド名(echo
など)をこのコマンドの引数に渡します。
$ man echo
詳細はシステムによって異なりますが、私のシステムでman echo
を実行した結果をリスト 2.2に示します10。
man echo
.
$ man echo
ECHO(1) BSD General Commands Manual ECHO(1)
NAME
echo -- write arguments to the standard output
SYNOPSIS
echo [-n] [string ...]
DESCRIPTION
The echo utility writes any specified operands, separated by single blank
(` ') characters and followed by a newline (`\n') character, to the stan-
dard output.
The following option is available:
-n Do not print the trailing newline character. This may also be
achieved by appending `\c' to the end of the string, as is done by
iBCS2 compatible systems. Note that this option as well as the
effect of `\c' are implementation-defined in IEEE Std 1003.1-2001
(``POSIX.1'') as amended by Cor. 1-2002. Applications aiming for
maximum portability are strongly encouraged to use printf(1) to
suppress the newline character.
:
リスト 2.2の最終行に表示されているコロン :
は、その下にまだ続きがあることを示しています。システムによって異なることがありますが、私のシステムでは、下矢印キーを押すと1行進み、スペースバーを押すと1ページ進みます。manページを閉じるには、「q」(quitの略)キーを押します。この操作方法は、セクション4.3で扱うless
というプログラムでも役立ちます。
man
はそれ自体がコマンドなので、リスト 2.3のようにman
のman
ページを見ることもできます(図 2.9)11。
man man
の実行結果
$ man man
man(1) man(1)
NAME
man - format and display the on-line manual pages
SYNOPSIS
man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]
[-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list]
[section] name ...
DESCRIPTION
man formats and displays the on-line manual pages. If you specify sec-
tion, man only looks in that section of the manual. name is normally
the name of the manual page, which is typically the name of a command,
function, or file. However, if name contains a slash (/) then man
interprets it as a file specification, so that you can do man ./foo.5
or even man /cd/foo/bar.1.gz.
See below for a description of where man looks for the manual page
files.
OPTIONS
-C config_file
:
リスト 2.3から、man
の概要が次のようになっていることがわかります。
man [-acdfFhkKtwW] [--path] [-m system] [-p string] ...
先ほど「謎の記法に満ちた」と書いたのはこれのことです。実を言うと、manページに書いてあることを隅から隅まで理解するのは私でもほぼ無理です。しかしmanページに書いてあることを読み解き、コマンドの内容を高いレベルで把握できるようになること自体が高いスキルとなりますし、習得する価値があります。manページを読みこなせるようになるために、新しいコマンドに出会ったらman <コマンド名>
を実行する癖をつけることをおすすめします。たとえ細かい部分まで完全に理解できなくても、manページをじっくり読むことで、開発者にとって欠かせない熟練(コラム 2.3)12のスキルを養うことができるからです。
数学の世界では、代数/幾何/数論/解析といったさまざまな科目を、少数の仮定すなわち公理に落とし込むことで発展できます。それによって、これらの科目は完全に自己完結し、かつ形式的なスキルが不要になるので、小さい子どもですら学べるようになるのです(原理的にはですが)。現実には他にもさまざまなスキルが要求されますし、数学者たちは何かと成熟した数学スキル(すなわち数学の証明を理解して書くのに必要な経験や一般的な習熟度)を推奨するものですが。
IT技術においても似たような感じのスキル(正確には「スキルのセット」)があり、熟練という形を取っています。熟練には、テキストエディタやUnixコマンドラインの使いこなしのような「ハードスキル」はもちろん、適切なメニュー項目を調べるとか用語をGoogleで調べる(図 2.10)といった「ソフトスキル」も重要ですし、かつ、コンピュータで何をやったらどうなるかというポイントを押さえて作業するという「姿勢」も重要です(コラム 1.1)。こうしたソフトスキルや姿勢を皆さんに直接教えるのは難しいものです。皆さんが他のチュートリアルまで進むときは、ぜひとも熟練を積めるチャンスを逃さないようにすべきです。manページをすばやく読みこなす方法(2.3のように、どんなことでも技術を高める肥やしになるのですから。そうやって時間をかけて修練を重ねれば、図 2.10の作者のように、あらゆるプログラムを自由に使いこなせる魔法のような力を会得できるでしょう。
なお図 2.10は、一般的な問題解決のための重要なテクニックがいくつか抜けています。
- アプリケーションを再起動したか?
- デバイスを再起動したか?
- アプリをアンインストールして再インストールしてみたか?
コンピュータで起きる謎のエラーの90%は、おそらく#2.を試すだけで解決できます。
2.3.1 演習
-
echo
コマンドの短い説明と長い説明は、manページで何と書かれていますか? -
リスト 2.1にあるように、
echo
コマンドは受け取った引数をそのまま画面に出力し、次の行に改行して新しいプロンプトを出力します。改行されるのは、newline と呼ばれる特殊文字が末尾に追加されるからです(newlineはその名の通り、改行してそこから文字列を次の行に出力するもので、多くの場合「\n
」(バックスラッシュ n)と表記します)。echo
コマンドで出力する文字列には改行をはさまないことが多いので、newlineが文字列に挿入されないようにする特殊なコマンドラインオプションもあります。echo
コマンドのmanページを読んで、「hello」と出力するときに末尾にnewlineを出力しないようにする方法を調べ、ターミナルで実際に動かして確かめてみましょう。ヒント: コマンドラインのどれがオプションかを知りたい場合は、図 2.4が役立つかも知れません。実際にやってみた結果をリスト 2.4やリスト 2.5と比較して、オプションが期待どおりに動いたかどうかを確認すること。
メモ: この演習は、古いバージョンのmacOSにあるデフォルトのターミナルだとうまくいかない可能性があります。その場合はiTermをインストールすることをおすすめします(iTermはいろんな意味でおすすめです)。
echo
の末尾が改行される場合(オプションなし)
hello
[~]$
echo
の末尾が改行されない場合(オプションあり)
hello[~]$
2.4 入力行を編集する
コマンドラインにはさまざまな機能が備わっているので、先ほど実行したコマンドを繰り返すのも簡単ですし、コマンドを少し手直し(編集)してから実行することもできます。こうした操作を含むコマンドラインのさまざまな機能では、キーボードの特殊キーを活用します。Macintoshの典型的なキーボードで使われている特殊キーとその記号の対応を表 2.1に掲載しました。今使っているキーボードがこれと違っている方は、「熟練」(コラム 2.3)のチャンスと思って挑戦しましょう。
キーの読み方 | 記号 |
コマンド(Command) | ⌘ |
コントロール(Control) | ⌃ |
シフト(Shift) | ⇧ |
オプション(Option) | ⌥ |
上矢印、下矢印、左矢印、右矢印 | ↑ ↓ ← → |
EnterまたはReturn | ↵ |
タブ(Tab) | ⇥ |
削除(Delete) | ⌫ |
「上矢印キー」 ↑は、入力行の編集でよく使われます。このキーを押すと、直前のコマンドが表示されます。繰り返しキーを押すと、過去のコマンドを次々にさかのぼって1つずつ表示します。逆に戻るには「下矢印キー」 ↓ を押します。
Controlキーも入力行の編集でよく使われます。なおControlキーは通常「Ctrl
」または「 ⌃
」と表記します(コラム 2.2参照)。たとえばコマンドの入力中や、直前のコマンドを表示したときに、入力行をその場でちょっぴり手直しできると何かと便利です。たとえば以下のように入力した直後に「しまった、goodbyeの前にecho
と入力したかったのに」と思ったとしましょう。
$ goodbye
そんなときは慌てず騒がず ←キーを何回か押して入力行の先頭まで戻ればよいのですが、実はもっと楽な方法があるのです。⌃A
と入力すれば一瞬で入力行の先頭までジャンプします。同様に、⌃E
を押せば入力行の末尾にジャンプしますし13、⌃U
を押せば、入力行を一発で全消ししてやり直せます。
⌃A
、⌃E
、⌃U
はほぼどんなシステムでも使えますが、シェークスピアのソネット1番(リスト 2.6)の最初の行みたいに長い行を扱うにはあまり向いていません。
$ echo "From fairest creatures we desire increase,"
上の「From」を原典(図 2.11)に忠実な「FRom」に変えたいとしましょう14。⌃A
を押してから右矢印キーを数回押してもいいのですが、システムによってはキーボードとマウスを組み合わせて直接ジャンプできることもあります。つまりOptionキーを押しながら15、コマンド内のカーソルを置きたい場所をマウスでクリックします。すると「From」の「o」のところにカーソルが移動するので、「r」を削除してリスト 2.7のように直接変更します。
$ echo "FRom fairest creatures we desire increase,"
私は⌃A
と⌃E
と左矢印キーと右矢印キーでたいていのことはやれますが、長めのコマンドではOptionクリックが使えると非常に助かります(私は入力中にすぐ気が変わるたちなので、⌃U
で入力行を全消しする方が結局一番早くできます)。
2.4.1 演習
-
echo
コマンドを毎回入力せずに、上矢印キーを押して「fee」「fie」「foe」「fum」と出力しましょう。 -
リスト 2.6を入力し、次に
⌃A
と⌃E
と矢印キー(またはOptionクリック)を組み合わせて、原典(図 2.11)の外観に忠実に、通常の「s」を古英語の特殊な「ſ」(long s)に置き換えましょう。つまり、echo
の引数が「FRom faireſt creatures we deſire increaſe,」となるようにします。ヒント: 「ſ」という文字は普通のキーボードではそのまま入力できない可能性がありますので、このチュートリアルからこの文字をコピーするか、ググって見つけた文字をコピーするかして使います(この文字をターミナルにうまく貼り付けられない場合は、コラム 2.3の練習として自分のシステムで貼り付ける方法を見つけましょう)。
2.5 画面の内容を消す
コマンドラインを使っていると、画面に表示されているものをすべて消せると便利な場合があります。これはclear
でできます。
$ clear
このコマンドのキーボードショートカットは⌃L
です。
同様に、ターミナルウィンドウ(またはターミナルのタブ)での作業を終えたら、exit
コマンドを入力すると、ウィンドウ(またはタブ)が閉じて終了します。
$ exit
このコマンドのキーボードショートカットは⌃D
です。
2.5.1 演習
- ターミナルの現在のタブの内容を消しましょう。
- 新しいタブを1つ開き、
echo 'hello'
と入力し、それから終了してみましょう。
2.6 まとめ
本セクションで学んだ重要なコマンドを表 2.2にまとめました。
コマンド | 説明 | 例 |
echo <文字列> |
画面に文字列を出力する | $ echo hello |
man <コマンド名> |
コマンドのマニュアルページを表示する | $ man echo |
⌃C |
トラブル脱出用 |
$ tail ^C
|
⌃A |
入力行の冒頭にカーソルを移動する | |
⌃E |
入力行の末尾にカーソルを移動する | |
⌃U |
入力行の内容をすべて削除する | |
Option-クリック | クリックした場所にカーソルを移動 | |
上矢印キー & 下矢印キー | コマンド履歴を前後に移動する | |
clear または ⌃L
|
画面の内容を消す | $ clear |
exit または ⌃D
|
ターミナルを終了する | $ exit |
Ctrl-C
は、ターミナルに対して特殊なコントロールコードが送信されるもので、大文字のCを生成することとは関係ありません。
Railsチュートリアルは YassLab 社によって運営されています。
コンテンツを継続的に提供するため、書籍・動画・質問対応サービスなどもご検討していただけると嬉しいです。
研修支援や教材連携にも対応しています。note マガジンや YouTube チャンネルも始めたので、よければぜひ遊びに来てください!