Lesson 3

シェルの利用

Lesson 3 Chapter 1
シェルとは

Lesson3では「シェル」について主に学んでいきましょう。 シェルとはキーボードから入力されたテキストを「コマンド」という形でカーネルに伝える役割を持つソフトウェアをさします。

シェルのイメージとしては、映画やドラマ等でプログラマーがPCの黒い画面に向かって文字を入力しているシーン思い浮かべてください。 その時、プログラマーは黒い画面からコマンドを入力して、カーネルに向かって「〇〇を実行してください」と命令をしているのです。 この時、命令に対する処理自体はカーネルが行いますが、プログラマーからカーネルへは直接命令を送れないため、シェルが代わりに命令を伝達しています。

シェルのイメージ

CLIとGUI

CLI(コマンドラインインターフェース)とは、キーボードからコマンドなどのテキストを入力して、結果をテキストとして出力するインターフェースです。 簡単に言うと、キーボードからの文字入力のみでパソコンを操作するイメージです。 シェルを通してカーネルに命令をする場合がこれにあたります。 同じ意味としてCUI(キャラクターユーザーインターフェース)とも呼ばれることがあります。

対して、普段マウスでPCを操作しているのがGUI(グラフィカルユーザーインタフェース)です。

LinuxはCLIを使って操作することが基本となりますので、これから慣れていきましょう。

シェルでのコマンドの実行方法

シェルからカーネルに命令を送るとは、具体的にはどのようにして行うのでしょうか? それは以下のように二つの方法があります。

方法 内容
対話的に実行する方法 シェルの画面に、コマンドを直接打ち込んで実行する方法。何行にも及ぶコマンドを実行するには適さないが、短いコマンドを実行するのに適している。
シェルスクリプトとして実行する方法 あらかじめシェルのコマンドを記述したファイルを用意し、シェルの画面にそのファイル名を打ち込んで実行する方法。 あらかじめファイルを記述して準備するため、何行にも及ぶ処理をまとめて実行するのに適している。

いろいろなシェル

また今までシェルと一括りに表現していましたが、シェルには下図のように色々な種類があります。

種類 内容
sh 最も古くから存在するシェル。歴史が長いためシェルスクリプトを書く際はshを使用するのが一般的。 しかし古いシェルで機能が少ないため、対話的に使うには向いておらず、ログインシェルとしてはあまり使われない。
csh shと同じく、古くからあるシェルの一つ。対話的操作に長けているが、シェルスクリプトを書くことに適していない。 現在は後継のtcshがあるため、ほとんど使われていない。
bash shをベースに機能を拡張したシェル。shと後方互換があるため、shを置き換える用途で使用でき、シェルスクリプトを記載することに長けている。 また、対話型操作においても十分な機能を持つため、ログインシェルとしてもよく使われる。
tcsh cshの後継として開発されたシェルで、対話的操作で便利な機能が多くある。 しかしcsh同様に、シェルスクリプトを書くには向いていない。
zsh bashやtcsh等他のシェルの機能を積極的に取り入れ、さらに独自の拡張も加えたシェル。 非常に多くの機能をもち、使いこなすことが出来れば効率的に作業ができる。 その半面、初心者の学習向けには適さない。

この表から分かるとおり、bashはシェルスクリプトを書くことに長けており、かつログインシェルとしても広く使われています。 またzshと異なり、初学者にとっても入門のハードルが低いです。従って今後はbashについて学習を進めていきます。

ログインシェルとは?

皆さんがVirtualBoxでLinuxにログインした時に、何も指示しなくとも、シェルが起動していました。 このように、Linuxログイン時に自動的に起動されるシェルをログインシェルと呼びます。 以下のように打つことで、ログインシェルが何かを確認することが出来ます。この例ではbashが使われていることが分かります。

 $ echo $SHELL
/bin/bash

Lesson 3 Chapter 2
ファイルシステムとディレクトリ

Chapter1ではシェルの役割について説明をしました。 早速シェルを使った操作を始めたいところですが、その前に「ファイルシステムとディレクトリ」について説明します。 これはLinuxを理解するうえでの基本となる内容なので、bashについて説明する際にも理解しておくことが必要な事項だからです。

ファイルシステム

linuxで扱うデータはすべて「ファイル」として扱われます。 そのためファイルの操作方法を学ぶことは、Linux学習においてとても重要な項目です。

ファイルシステムとは、コンピュータがストレージデバイスに、ファイルを格納・管理する際に利用される、OSの機能です。

ファイルシステムがないとどうなるでしょうか? その場合、ファイルを保存する際に、ストレージデバイスのどこの領域からどこの領域に保存しようか・・・等のことを人間が手動で行わなければいけません。 現在のストレージデバイスの容量を考えると、何ギガ、何テラバイト単位の巨大なデータの中で、どこに何が保存されているかを管理しなくてはいけなくなります。 これを人間が行うのは、あまりにも途方もないことです。

ファイルシステムがないと

このような巨大なデータを人間の理解しやすいファイルという概念でまとめ、データを管理しやすくする機能がファイルシステムです。

Linuxにおけるファイル

Linuxでは”すべて”のデータをファイルで扱います。 それは単に文章や画像等のデータのみではなく、CDやキーボードといった入出力装置にもそれぞれファイルが割り当てられており、そのファイルを介して機器を操作しています。

ディレクトリ

ディレクトリとは、Linuxがファイルを整理・分類するための入れ物のようなものです。 これはWindowsでフォルダと呼ばれているものと同じものです。

ディレクトリ

また、ある特殊なディレクトリには特別の名前をつけて呼ばれることがあります。それが以下で説明する「カレントディレクトリ」、「ルートディレクトリ」、「ホームディレクトリ」です。

カレントディレクトリ

「カレントディレクトリ」とは、現在自分が作業中のディレクトリのことです。カレントディレクトリとは特定の一つのディレクトリを指すのではなく、 その時々によって指されるものが変わります。

カレントディレクトリ

ルートディレクトリ

Linuxでのディレクトリ構造は、一つのディレクトリを頂点としたツリー構造となっています。 この全ての頂点に位置するディレクトリを「ルートディレクトリ」と呼びます。

Linuxのディレクトリ構成イメージ

ホームディレクトリ

「ホームディレクトリ」とは、ユーザーがログインした際のカレントディレクトリです。 CentOSでは、ルートディレクトリ直下の「home」ディレクトリの中に、ユーザー名と同じ名前のフォルダがユーザー分だけ割り当てられます。 それらのディレクトリが「ホームディレクトリ」です。 ユーザーはこのホームディレクトリ内に自身のファイルやディレクトリを作成し作業することができます。

centosの場合のホームディレクトリ

Lesson 3 Chapter 3
bash

Chapter2ではファイルシステムとディレクトリについて解説しました。 Chapter3では本レッスンの主役であるシェル(bash)を使って、ファイルを操作したり、色々なディレクトリを行き来してみましょう。

VirtualBoxでCentOSを起動し、ユーザー名とパスワードを入力してログインしてください。以下はユーザー名に「vboxuser」と入力しています。 皆さんもChapter2で設定したユーザー名を入力して下さい。 パスワードは入力しても表示されませんが、内部的には入力されているので、完了したら構わず「Enter」キーを押してください。 するとログインシェルが起動され、下図の緑色箇所のように、[ユーザー名@localhost ~]$ _と表示されます。

centosログイン時画面

これでシェルの起動が完了しました。次に様々なbashのコマンドを紹介していきます。

pwd

pwdコマンドは、カレントディレクトリを確認するコマンドです。基本の書式は以下になります。

pwd

書式どおり、以下のように実行します。 すると、現在のカレントディレクトリは/home/vboxuserであると表示されました。

$ pwd
/home/vboxuser

また、以上はvboxuserというユーザー名でログインした直後でのカレントディレクトリなので、vboxuserにとってのホームディレクトリとも呼ぶことができます。

touch

touchコマンドは、新しいファイルを作成することができます。 新しく出来上がるファイルは中身が空のファイルです。 基本の書式は以下になります。

 touch <ファイル名>

以下のようにtouchコマンドの後ろに新ファイル名を入力することで、新たなファイルが作成されます。

$ touch test00.txt

またtouch の後に複数のファイル名を指定することもできます。

$ touch test01.txt test02.txt

これで「test00.txt」、「test01.txt」、「test02.txt」の3つのファイルが作成されているはずです。

「touch」コマンドは、指定したファイル名のファイルが既に存在していた場合、そのファイルの作成日時等のタイムスタンプを書き換えます。 しかし、ファイルの内容自体は書き換えないため、元のファイルを削除するという心配をしないで実行することができます。

$ touch test01.txt

なお、以下はtouchコマンドの主なオプションです。

オプション 効果
-d <タイムスタンプ> 指定したファイルのタイムスタンプを変更する。
-c 既に指定したファイルのタイムスタンプを現在時刻に変更する。ファイルが存在しない場合はなにもしない(新規でファイル作成等を行わない)。

なお「-d」オプションのタイムスタンプの指定方法は、以下のように指定します。この例では、タイムスタンプが2023年1月1日13時00分に更新されます。

$ touch -d "2023/1/1/ 13:00" <ファイル名>

ls

lsコマンドは、指定するディレクトリ内に存在するファイルやディレクトリを表示することが出来ます。基本の書式は以下になります。

 ls <オプション> <ディレクトリ名>

ディレクトリを指定しない場合はカレントディレクトリ内のファイルやディレクトリが表示されます。

$ ls
test00.txt test01.txt test02.txt

先ほど作成したtest00.txt、test01.txt、test02.txtが作成されていることが確認できます。

今度はルートディレクトリ内のファイルを見てみましょう。lsコマンドの後に「/」を入力します。 このように単に一文字「/」と打った時、それはルートディレクトリを意味します。

$ ls / 
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr

「-l」オプションを付けることで、詳細情報をあわせて表示することが出来ます。 今後説明する内容が含まれるため、現時点では細かな解説はしませんが、ファイル作成時刻などが表示されていることが分かると思います。

 $ ls -l
                      
-rw-rw-r-- 1 vboxuser vboxuser 0 Jan 12 17:24 test00.txt
-rw-rw-r-- 1 vboxuser vboxuser 0 Jan 12 17:26 test01.txt
-rw-rw-r-- 1 vboxuser vboxuser 0 Jan 12 17:26 test02.txt

「-a」オプションをつけることで、カレントディレクトリ内の隠しファイルを表示することが出来ます。 「.ファイル名」となっているファイルが、隠しファイルです。 また、「.」はカレントディレクトリを、「..」はカレントディレクトリの一つ上位のディレクトリを表します。

$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc test00.txt test01.txt test02.txt .viminfo

以下の表はlsコマンドの主なオプションをまとめたものです。

オプション 効果
-l 現在のディレクトリに存在するファイルやディレクトリを、詳細情報を含めて表示する。
-a 現在のディレクトリに存在するファイルやディレクトリを、隠しファイルを含めて表示する。

ディレクトリに関する特殊な記号

記号 意味
/ ルートディレクトリ
. カレントディレクトリ
.. カレントディレクトリの一つ上位のディレクトリ

隠しファイルの正体

上ではホームディレクトリでls -aを実行して隠しファイルを表示しました。 これらは下表のとおり、bashの設定や使用履歴等が記載されたファイルです。

ファイル名 内容
.bash_history bashの使用履歴が収められたファイル
.bash_profile bashでログインした時に読み込まれる設定ファイル
.bash_logout bashでログインした状態から、ログアウトした時に読み込まれる設定ファイル
.bashrc bashが起動するときに読み込まれるファイル

mkdir

mkdirコマンドは新しいディレクトリを作成することが出来ます。 基本の書式は以下になります。

mkdir <オプション> <ディレクトリ名>

「new_dir」ディレクトリを作成します。 また、lsコマンドで、「new_dir」ディレクトリが作成されていることを確認します。

$ mkdir new_dir
$ ls
new_dir test00.txt test01.txt test02.txt

なお、mkdirコマンドも、touchコマンドと同様に、複数ディレクトリをまとめて作成することが出来ます。

 $ mkdir new_dir2 new_dir3

今度はカレントディレクトリ内に、「wheather/sunny」ディレクトリを作成してみましょう。

 $ mkdir wheather/sunny
mkdir: cannot create directory 'wheather/sunny' : No such file or directory

エラーとなってしまいました。これは現在「wheather」というディレクトリが存在しないにもかかわらず、「wheather」直下に「sunny」を作るように指示したためです。 このような場合、オプションに「-p」をつけることで、「wheather/sunny」ディレクトリを作成することが出来ます。

$ mkdir -p wheather/sunny
$ ls ./wheather/
sunny

以下の表はmkdirコマンドの主なオプションをまとめたものです。

オプション 効果
-m <アクセス権> ディレクトリの作成と同時に、ディレクトリへのアクセス権を設定する。
-p 中間ディレクトリを同時に作成する。

「-m <アクセス権>」については、後で説明するファイルのアクセス権の内容が含まれるため、現時点では詳細の説明を省きますが、使用例だけ簡単に紹介します。 以下の777とは、どのようなユーザーでも、ファイルを自由に操作できるという意味を表します。 従って以下のコマンドでは、誰でも自由に読み書きや実行ができる「permitted」というファイルを作成していることになります。

 $ mkdir -m 777 permitted

rm

rmコマンドは、ファイルを削除することができます。基本の書式は以下になります。

rm  <オプション> <ファイル名>

-iオプションを使用することでファイル削除前に確認メッセージを表示させることができるので便利です。

$ rm -i test01.txt test02.txt

確認メッセージが出たら「y」を入力すれば削除されます。もし削除したくない場合は「y」以外または何も入力せずEnter を押下すれば削除されません。

また、オプションに「-r」を指定することで、ディレクトリを削除することが出来ます。

$ rm -r new_dir3

ファイルやディレクトリをまとめて削除することもできます。 以下ではディレクトリをまとめて削除しています。 またこの場合では、「wheather」ディレクトリと、その直下の「sunny」ディレクトリが一度に削除されます。

$ rm -r new_dir new_dir2 wheather
$ ls
test00

以下の表はrmコマンドの主なオプションをまとめたものです。

オプション 効果
-i ファイル、ディレクトリを削除する前に、ユーザーへ確認をする。
-r ディレクトリを削除する。指定したディレクトリ内のファイルやディレクトリも同時に削除される。

rmdir

rmdirコマンドは、空のディレクトリを削除することができます。 中に別のファイルやディレクトリが入っていた場合に削除できないのが、先ほどの「rm」コマンドに「-r」オプションを付けた場合との相違点です。 基本の書式は以下になります。

rmdir  <ディレクトリ名>

コマンドを試す準備として以下を実行してください。

 $ mkdir -p new_dir wheather/sunny/

以下のようにnew_dirを削除することが出来ます。

pre> $ rmdir new_dir

一方、wheatherディレクトリを削除しようとすると、エラーとなります。 wheatherディレクトリにはsunnyディレクトリが入っているため、rmdirでは削除できません。

 $ rmdir wheather/
rmdir: failed to remove 'wheather/':Directory not empty

cd

cdコマンドは、カレントディレクトリを移動するコマンドです。基本の書式は以下になります。

cd <移動先のディレクトリ>

上記書式の移動先のディレクトリには、絶対パスでディレクトリを指定する方法と、相対パスでディレクトリを指定する場合があります。

ディレクトリ指定方法 意味
絶対パス ルートディレクトリから見た時の、ディレクトリのパス
相対パス カレントディレクトリから見た時の、ディレクトリのパス

まずは絶対パスを指定してwheather直下のsunnyへ移動してみましょう。 絶対パスは必ずルートディレクトリを意味する「/」の文字から始まります。 また、以下の例で「vboxuser」と記載されている箇所は、皆さんのユーザー名を入れてください。

 $ cd /home/vboxuser/weather/sunny/

もう一度絶対パスを指定してvboxuserディレクトリへ戻りましょう。

 $ cd /home/vboxuser/

次に相対パスを指定してwheather直下のsunnyへ移動してみましょう。 相対パスはカレントディレクトリを意味する「.」の文字から始まります。

 $ cd ./weather/sunny/

もう一度相対パスを指定してvboxuserディレクトリへ戻りましょう。 以下の「..」とはカレントディレクトリの一つ上位のディレクトリを意味します。 従って、以下はカレントディレクトリの二つ上位のディレクトリである、vboxuserディレクトリに移動します。

 $ cd ../../

echo

echoコマンドは引数に指定した文字を出力します。基本の書式は以下になります。

echo <オプション> <出力文字>

以下の例では「hello」の文字を表示しています。

 $ echo "hello"
hello

出力する文字の後に「> ファイル名」とすることで、指定したファイルに文字を書き込むことが出来ます。 以下を実行すると、test00.txtには「hello」と書き込まれます。 ただし、元々ファイルに何かが書かれていた場合、上書きされてしまうので気を付けてください。

 $ echo "hello" > test00.txt

上書きせずにファイルの末尾に追記したい場合は、「>> ファイル名」とします。 test00.txtは既に「hello」と書き込まれているので、以下を実行すると、test00.txtには1行目にhelloが、2行目にtakeshiが書き込まれた状態となります。

 $ echo "takeshi" >> test00.txt

echoは通常、出力するテキストのあとに、改行を含んで出力します。 オプションに「-n」を指定することで、改行を含まないでテキストを出力することが出来ます。

 [<ユーザー名&gt:@localhost]$ echo -n "hello"
hello[<ユーザー名>@localhost]$ _

また改行させて複数行として表示させたい場合は以下のように半角の「\」+「n」という特殊な文字を使用します。 (半角の「\」は以下の例のように、半角の「¥」と表示されてしまう場合がありますが、内部的には同じ文字なので問題ありません。)

 $ echo "one \n two"
one
two

以下の表はechoコマンドの主なオプションをまとめたものです。

オプション 効果
-n 改行を含まないで文字を出力する。
-e 改行、タブ、バックスペース等の特殊な意味を表す文字を、認識して出力する。例えば「\n」という文字は、「\n」とは表示されず、「改行」として出力される。

cat

catコマンドは、指定したファイルの中身を見ることができます。基本の書式は以下になります。

cat <オプション> <ファイル名>

先ほどechoコマンドでtest00.txtファイルの中に、helloとtakeshiの文字を書き込んでいるはずです。 本当に書き込みがなされているか確認します。

$ cat test00.txt
hello
takeshi

意図したとおりに書き込まれているのが確認できました。

またcatコマンドはオプションに-nをつけることで、行頭に行番号を表示することが出来ます。

$ cat -n test00.txt
1 hello
2 takeshi

以下の表はcatコマンドの主なオプションをまとめたものです。

オプション 効果
-n 行頭に行番号を表示する。

cp

cpコマンドは、ファイルやディレクトリをコピーするために使われます。基本の書式は以下になります。

cp <オプション> <コピー元のファイル名> <コピー先のファイル名>

以下を実行すると、test00.txtと同じ内容のファイルが、destination.txtという名前で作成されます。 この時、destination.txtファイルが存在していない場合は新規にdestination.txtファイルが作成されます。 また、destination.txtファイルが存在している場合は、既存の内容がtest00.txtファイルの中身に書き換えられるため、気を付けてください。

$ cp test00.txt destination.txt

上記を実行してcatコマンドで作成したdestination.txtファイルを確認すると「hello」と「takeshi」の文字がコピーされていることが確認できます。

既述のとおり、cpコマンドは既に同じ名前のファイルがある場合、既存のファイルを上書きしてコピーしてしまいます。 それは元々あったファイルを意図せず削除してしまうことを意味します。 そのような時に、「-i」オプションを付けてコマンドを実行すれば、コピーの実行前に、本当に処理を実行してもよいか確認されるようになります。 以下のように確認された時点で、「y」と入力し「enter」キーを押せば、コピーが実行されます。その他の文字を入力、又は何も入力しない場合は、コピーは実行されません。

 $ cp -i test00.txt destination.txt
cp: overwrite 'destination.txt' ? _

ファイルを他のディレクトリ直下にコピーする時は以下のようにして実行できます。コピー元のファイルは複数個指定できます。

cp <コピー元のファイル名1>…<コピー元のファイル名n> <コピー先のディレクトリ>

以下はmkdirコマンドでtest_allディレクトリを作成し、 test00.txtファイルをtest_allディレクトリ直下にコピーしています。 そして3行目のlsコマンドでtest_allディレクトリにtest00.txtファイルが生成されていることを確認しています。

$ mkdir test_all
$ cp test00.txt test_all
$ ls test_all
test00.txt

通常cpコマンドは、ファイルのコピーを行います。 しかし「-r」オプションを指定することで、ディレクトリをコピーすることが出来ます。 この時ディレクトリ内に別のファイルやディレクトリがある場合、それらも同時にコピーされます。

$ cp -r test_all

以下の表はcpコマンドの主なオプションをまとめたものです。

オプション 効果
-i コピーを本当に実行していいか確認する。
-r ディレクトリをコピーする。ディレクトリ内に他のファイルやディレクトリがある場合、それらも含めてコピーされる。

mv

mvコマンドは、ファイルやディレクトリを指定先に移動させたい場合に使用します。基本の書式は以下になります。

mv <移動元のファイル又はディレクトリ名> <移動先のファイル名又はディレクトリ名>

cpコマンドと使い方は似ていますが、移動先にファイルを指定するか、ディレクトリを指定するかで挙動が少し異なります。

まず「移動先にファイルを指定する場合」についてです。

$ touch file01.txt file02.txt
$ mv file01.txt file02.txt

上記を実行して、lsコマンドでファイルの存在を確認してみてください。作成したはずの「file01.txt」と「file02.txt」のうち、 「file01.txt」がなくなっていることが確認できると思います。

$ ls
file02.txt

「移動先にファイルを指定する場合」には、移動元のファイルが移動先のファイルに上書きされるという動きをします。 なので移動元にはファイルはなくなり、移動先にだけファイルが残っているのです。

続いて、「移動先にディレクトリを指定する場合」についてです。 「移動先にディレクトリを指定する場合」とは、「移動元にファイル、移動先にディレクトリを指定する場合」と「移動元にディレクトリ、移動先にディレクトリを指定する場合」の 二つを含みます。

$ mv file02.txt test_all
$ ls test_all
file02.txt

test_allディレクトリ直下に「file02.txt」が移動していることが確認できます。 元々「file02.txt」があったホームディレクトリからは「file02.txt」がなくなっていることも合わせて確認してください。 このように、「移動元にファイル、移動先にディレクトリを指定する場合」は、移動先ディレクトリ直下に指定したファイルが移動され、移動元からはファイルの存在が消えます。 また同じく、「移動元にディレクトリ、移動先にディレクトリを指定する場合」についても、移動先ディレクトリ直下に指定したディレクトリが移動され、移動元からはディレクトリの存在が消えます。

移動元 移動先 mvコマンド実行時の挙動
ファイル ファイル 移動元のファイルが移動先のファイルに上書きされ、移動元のファイル元の場所からなくなる。
ディレクトリ ファイル エラーとなり実行できない。
ファイル ディレクトリ ファイルがディレクトリに移動し、ファイルは元の場所から消える。
ディレクトリ ディレクトリ 移動元のディレクトリが移動先のディレクトリに移動し、移動元のディレクトリは元の場所から消える。

「mv」コマンドにおいても「-i」オプションを付けることで、コマンドを本当に実行するか、確認することができます。

 $ touch file01.txt file02.txt
$ mv -i file01.txt file02.txt
mv: overwrite 'file02.txt'? _

ここで「y」を入力して「Enter」を押すと移動が実行され、その他の文字を入力、又は何も入力しない場合は何も実行されません。

以下の表はmvコマンドの主なオプションをまとめたものです。

オプション 効果
-i 移動を本当に実行していいか確認する。

ln

lnコマンドは、ファイルへのリンクを作成できるコマンドです。Linuxでは下図のとおり2種類のリンクがあります。

区別 内容
ハードリンク 一つのファイルの実体にもう一つの名前を与える機能。元のファイルを削除しても、ハードリンクがある限り、アクセスすることができる。 ディレクトリに対して作成できない、異なる物理ディスク間をまたがることが出来ない等の制約があり、現在では限定的にしか使用されない。
シンボリックリンク リンク先のパス名が書かれた特殊なファイル。ファイルの実態はあくまでリンク先にある。従って元のファイルを削除すると、シンボリックリンクからアクセスできなくなる。

lnコマンドの書式は以下になります。

ln <オプション> <リンク元のファイル名> <リンクファイル名>

以下でハードリンクとシンボリックリンクを作成するので、準備として以下を実行してください。

$ touch target 
echo I am a target file > target
$ cp target target2

「I am a target file」と記載された、targetファイルとtarget2ファイルを作成しました。

ではハードリンクを作成しましょう。ハードリンクは、上記書式でオプションに何も指定せずに実行することで、作成できます。

$ ln target hardlink

hardlinkファイルの中身を確認してみます。targetファイルと同じ内容を見ることが出来ます。

$ cat hardlink
I am a target file

次に、ハードリンク作成の元である、targetファイルを削除したのちに、再度hardlinkファイルの中身を確認します。

$ rm target
$ cat hardlink
I am a target file

元となるtargetファイルは削除してしまいましたが、ハードリンクからは依然としてファイルの中身にアクセスできます。

次にシンボリックリンクを作成しましょう。シンボリックリンクは、上記書式でオプションに「-s」を指定して実行することで、作成できます。

$ ln -s target2 symbolic

symbolicファイルの中身を確認してみます。target2ファイルと同じ内容を見ることが出来ます。

$ cat symbolic
I am a target file

ここで、先ほど紹介したlsコマンドに、「-l」オプションをつけて実行してみましょう。 すると、ファイル名のところが「symbolic -> target2」となっています。 これは、symbolicファイルはtarget2ファイルのシンボリックリンクであるということを表しています。

 $ ls -l
lrwxrwxrwx, 1 vboxuser vboxuser 7 Jan 12 18:00 symbolic -> target2

次に、シンボリックリンク作成の元である、target2ファイルを削除したのちに、再度symbolicファイルの中身を確認します。

 $ rm target2
$ cat symbolic
cat: symbolic: No such file or directory

元となるtarget2ファイルを削除すると、シンボリックリンクからファイルの中身にアクセスできなくなります。

以下の表はlnコマンドの主なオプションをまとめたものです。

オプション 効果
-s シンボリックリンクを作成する。(このオプションを付けない場合は、ハードリンクが作成される。)

less

lessコマンドは、ファイルの内容を閲覧することが出来るコマンドです。 基本の書式は以下になります。

less <オプション> <ファイル名>

同じくファイルの内容を閲覧できるcatコマンドと似ているように思われますが、lessコマンドはテキストファイルの内容を表示する際にファイル全体を読み込みません。 そのため、容量が大きいファイルでも比較的高速で表示することができます。 lessコマンドではファイルの内容を表示中に、追加でキー入力することでスクロール操作や、テキスト検索などが行えます。 少し使ってみましょう。

$ less /etc/profile

上記を実行すると指定したファイルの中身を見れると思います。その状態で、「space」キーを追加で押すと1画面分スクロールしてくれます。 上に画面を戻したい場合は「u」キーを押せばよいです。最後に「/」キーを押してみてください。次に入力した値で検索することができます。 今回は「dev」と入力してみましょう。するとファイル中のdevというテキストを検索して該当部分に印をつけて表示してくれます。 最後に「q」キーを押して、ファイルの閲覧を終了します。 このようにしてlessコマンドはファイルを表示したり、追加キーでテキスト検索をすることができます。

find

findコマンドは、ファイルを検索したいときに利用されるコマンドです。書式は以下です。

find <検索場所> <オプション> <検索するファイル名>

findコマンドは、大量のファイルの中から目的のファイルを見つけたい場合に便利です。では少し試してみましょう。 同じような名前のファイルを複数つくり、その中から目的のファイルを探します。 以下の「test1*」は、「test1とその後複数の任意の文字」を意味します。 従って、以下では「test1~」から始まるファイルを検索することが出来ます。 「*」マークは正規表現と呼ばれる特殊な文字で、今後学習するため、現時点ではあまり気にしないで大丈夫です。

$ touch test00.txt test01.txt test02.txt test10.txt test11.txt test12.txt test13.txt
$ find test1*
test10.txt
test11.txt
test12.txt
test13.txt

which

whichコマンドは、指定したコマンドの実行ファイルのパスを表示してくれます。書式は以下です。

which <オプション> <コマンド名>

例えば今まで使ってきたcatコマンドの実行ファイルの格納場所を調べます。

 $ which cat
/bin/cat

このとおり、catコマンドでは「/bin」ディレクトリに格納されているcatファイルを実行していたのです。

whichコマンドは、「-a」オプションをつけることで、対象コマンドの実行ファイルを全て表示することが出来ます。 もう一度catコマンドにて試してみます。

 $ which -a cat
/bin/cat
/usr/bin/cat

以上よりcatコマンドの実行ファイルは、/bin/catと/usr/bin/catの二つがあるが、単に「cat」とした場合は/bin/catが実行されていることが分かりました。

なぜcatの実行ファイルが二つあるのか

先ほどcatコマンドの実行ファイルとして、「bin/cat」と「usr/bin/cat」があることが分かりました。 しかし、なぜ同じコマンドに対して二つの実行ファイルがあるのでしょうか? そのことについて調べるために、以下を実行してください。

$ ls -l /

すると、筆者の環境では以下のような結果が帰ってきました。

 $ ls -l /
lrwxrwxrwx. 1 root root 7 Jan 5 13:03 bin -> usr/bin

「bin -> usr/bin」となっています。 リンク(lnコマンド)の箇所ですでにご紹介したとおり、「/bin -> /usr/bin」とは「/bin」が「/usr/bin」のシンボリックリンクであることを意味します。 つまり、catコマンドの実行ファイルの本体は「usr/bin」なのですが、通常catコマンドではシンボリックリンクからcatが実行されていたのでした。

Tabキーによる入力補完

今まで何度か$ echoコマンドを入力して頂きましたが、ecのみ入力してから 「Tab」キーを押下してみてください。するとechoと自動表示されます。

 $ echo   「ec」と打ち込み、「Tab」キーで入力補完

この機能のことを「補完機能」と呼びます。自分ですべてを入力しなくても、入力内容を補完する機能がシェルには備わっているのです。 Linuxは使い慣れてくると、長いコマンド入力などが面倒になってきたりしますが、この機能を使うことによって効率的に作業できるようになります。

例えば、$ touch my_file_name_is_very_very_longと実行して、とても名前の長いファイルを作成してください。 このファイルの中身を確認したくなった時に、毎回$ cat my_file_name_is_very_very_longと入力しては大変ですし、タイプミスも発生しやすくなります。 そのような時に$ cat myと入力した状態で「Tab」キーを押してください。以下のように入力補完されて、とても楽にコマンドを実行できます。

 $ cat my_file_name_is_very_very_long   「cat my」と打ち込み、「Tag」キーで入力補完

少しずつこの機能に慣れて、使いこなせるようになりましょう。

manとhelp

今まで沢山のコマンドを学習してきましたが、一度に覚えきるのは難しいのではないでしょうか? インターネットでコマンドを検索して調べることも可能ですが、Linux自身に含まれている説明を読むことも出来ます。 コマンドの使用方法は、manコマンドとhelpオプションを使って調べることが出来ます。

manコマンド

manコマンドは指定したコマンドのマニュアルを表示します。またコマンドのマニュアルだけではなくLinuxの設定ファイルやライブラリなどのマニュアルも見ることができます。 早速見てみましょう。シェルにman catと入力して実行してみて下さい。今回はcatコマンドについてのマニュアルを見てみましょう。 manの書式は以下になります。

man <調べたいコマンド名>

catコマンドについてのマニュアルを見てみます。

$ man cat

以下のように表示され、コマンド概要、基本書式、設定可能なオプションとその効果を確認できます。

manコマンド.png

「space」キーで下にスクロール、「u」キーで上にスクロールできます。また「q」キーでマニュアル表示を終了できます。

helpオプション

続いてhelpオプションについて説明します。
多くのLinuxコマンドでは--helpというオプションが使用できます。このオプションは、コマンド自身のヘルプメッセージを表示することができます。 試してみましょう。下の画像ではcatコマンドにhelpオプションを追加してみました。

 $ cat --help

helpオプション.png

このようにhelpオプションを使うとコマンドの使用方法が見れますので、初めて使うコマンドは最初にhelpオプションを使って内容を確認してみるとよいでしょう。

Lesson 3 Chapter 4
Vim(vi)

Vim(または、vi)とはLinux向けのテキストエディタです。テキストエディタとはファイルに文字を書くためのもので、Windowsでは例えば「メモ帳」がそれにあたります。 シェルで色々な作業をしていると、ファイル中のテキストを編集したくなる場面があります。なので本チャプターではVim(vi)の操作方法を学びます。 Vim(vi)はほとんどのLinuxディストリビューションで標準エディタとして採用されているため操作には慣れておきましょう。

Vimとvi

上ではVim(vi)と記載していましたが、Vimとはviの上位互換として開発されたもので、二つはそれぞれ異なるテキストエディタです。 しかし、基本的な操作は共通するため、現時点ではデフォルトでインストールされている方を使えば問題ありません。

Vim(vi)はwindowsのメモ帳等と比べると、使い勝手がかなり異なります。 Vimはマウスを使わずに、キーボード操作のみでテキストを編集する前提で作られている為です。 慣れれば高速にテキストを編集出来るようになり便利なのですが、使いこなすには学習と練習が必要になります。

Vim(vi)がインストールされているか確認するにはシェルで $ vim --version を実行して調べてみてください。 インストールされている場合は以下のように表示されます。

vimのインストール有無確認

-bash: vim: command not foundとなった場合は、$ vi --version と入力してviのインストールの有無を確認してください。 デフォルトでインストールされていない場合はyum install vimを実行してインストールできます。

vimの起動と修了

vimの起動と終了について学びましょう。vimの起動はvimコマンドで行います。 シェルに$ vimと入力しEnterを押してみてください。

$ vim

viを使用する場合は、$ viと入力してEnterを押してください。

$ vi

すると以下のような画面になります。

Vim起動画面.png

これでVimの起動ができました。次はVimの終了をします。

終了するためには、キーボードから:qを押下します。 これでVimが終了しシェルの画面に戻るはずです。

vimでの新規ファイル作成

vimで新規ファイルを作成します。以下のように入力してください。

$ vim new_file

すると、「~」と書かれた行が並んでいると思います。

vimで新規ファイル作成

vimでは行に何も書かれていない状態を「~」で表現します。 次に、ファイルをそのまま保存します。下図のように:wと入力してください。

vimでファイルを保存

そして下図のように:q入力してファイルを閉じます。

vimでファイルを閉じる

lsコマンドを入力して、「new_file」ファイルが作成されていることを確認してください。

$ ls
new_file

vimの「w」や「q」コマンドはとてもよく使うため、上で紹介できなかった使い方を含めて、下表にまとめてあります。 実際にvimを操作しながら、以下のコマンドを試してみてください。

コマンド 内容
w ファイルを保存する。
q ファイルを閉じる。ファイルが未保存の状態ではエラーとなる。
q! ファイルを閉じる。ファイルが未保存であっても保存は反映されずに終了する。
wq ファイルを保存して終了する。

vimでのカーソル移動

vimの基本操作である、カーソル移動について学びます。練習用のファイルを準備するために、以下を実行して下さい。

$ cp /etc/crontab .

そして下のとおりファイルを開いてください。

$ vim crontab

以下のようなファイルが開かれたはずです。

crontabを開く.png

カーソルの移動として、vimでは以下のキーを使うことができます。 開いたファイルで、自由にカーソル移動を試して下さい。

押下するキー 内容
「H」ボタン 左に移動する
「J」ボタン 下に移動する
「K」ボタン 上に移動する
「L」ボタン 右に移動する

vimの操作に慣れるメリット

vimでは「↑」「↓」「←」「→」キーを押して、カーソル移動をすることもできます。 しかし、「↑」「↓」「←」「→」キーは通常キーボードの右手を少し右側に動かさないと、押下することが出来ません。 それでは、右手のポジショニングが変わってしまい、タッチタイピングがしずらくなってしまいます。

対して、「H」「J」「K」「L」ボタンは、キーボードの中心付近にあり、右手のポジショニングを変えずに押下することができます。 従って、これらのキーでのカーソル移動に慣れれば、タッチタイピングの妨げにならないメリットがあります。 是非「H」「J」「K」「L」を用いたカーソル移動に慣れていって下さい。

誤って「i」ボタンを押してしまった時

カーソル移動の練習中に誤って「i」ボタンを押してしまった場合は、「Esc」キーを押すことで、元に戻すことができます。 後述しますとおり、「i」ボタンを押すと、vimがファイルを編集できるモードに切り替わり、「H」キーなどでカーソル移動が出来なくなってしまいます。

vimでの文字編集

続いて文字の編集方法を学びます。カーソル移動で練習用として使ったファイルをもう一度用いて練習するので、ファイルを閉じてしまった場合は、 $ vim crontabとしてファイルを開いて下さい。 カーソル移動の際にお気づきのとおり、vimではキーを押下しても文字を入力することができません。 文字入力を可能とするためには、まず「i」ボタンを押す必要があります。先ほど練習したカーソル移動で入力したい箇所まで移動し、「i」ボタンを押して下さい。 押下後は任意の文字を入力できるようになっているため、自由に入力してみてください。

編集が終わったら、「Ctrl」+「C」ボタンを押すことで、文字入力可能な状態が解除されます。

設定ファイル

Vimは「vimrc」という個人設定ファイルを作ることによって操作性をカスタマイズすることができます。 初めてvimを使う際に便利な設定を二つ紹介します。

まず設定ファイルである「vimrc」ファイルを作成します。シェルでvim .vimrcを実行し、ファイルを作成し開いてください。 あとはこのファイルに好きな設定を記述していくだけです。今回は人気な設定を2つほど紹介します。

vimrcに記述する文字 内容
set number ファイルを開くと、各行頭に行番号が表示される。
set autoindent 新しい行のインデントを現在行と同じにする。

実際に設定を記述するイメージは下のとおりになります。

vimrcでの設定

次回vimでファイルを開いたときに、設定が反映されていることを、確認できます。

vimrcで設定が反映されたことを確認する

Lesson 3 Chapter 5
ssh

bashで色々な操作をしていると、他のPCにリモート接続して中に入り、作業をする場面が起こりえます。 例えばクラウドでサーバーを立て、そこにソフトウェアをインストールする場合を考えてみます。 サーバーはクラウド上にあるため、手元にはありません。 そのような時に、ご自身が今手元で操作しているシェルから、遠いクラウド上のサーバーの中に入り、各種作業をするのです。

リモート接続の方法としては、主に以下の二つがあります。表中に記載のとおり、セキュリティで優位なSSHが主流で使われるため、本チャプターではSSHについて説明をしていきます。

種類 内容
Telnet ネットワークに接続された機器にリモート接続するためのプロトコル。パスワードなど、データが暗号化されないで送信されるため、現在はほとんど使われない。
SSH Secure Shellの略称で、ネットワークに接続された機器にリモート接続するためのプロトコル。パスワードは勿論、データが暗号化されて送信されるため、Telnetよりも主流である。 主にUNIX系のOS(LinuxやMac)で使われる。

sshでリモートログイン

ここでは実際にSSHを使ってリモートログインを体験して頂きます。 準備として、VirtualBoxでもう一つCentOSを起動し、ネットワークの設定を行います。 VirtualBoxでCentOSを起動することについては、Lesson2で行ったため、適宜参照しつつサーバーを立ち上げてください。 以下では3つのサーバーが立ち上がっていますが、赤色部分のように2つだけ準備できれば大丈夫です。

二つのサーバを準備する

次にこれら二つのサーバーのネットワークの設定を行います。 以下のように、「ツール」の赤丸箇所、「ネットワーク」をクリックしてください。

ネットワーク設定1

「Host-only Netwoks」をクリックし、「DHCPサーバー」の欄が「有効」になっているネットワークを選択してください。 ネットワークが一つもない場合は、緑色個所の「作成(C)」ボタンを押すと、一つ作成されます。

ネットワーク設定2

また、「DHCPサーバー」が「無効」となっているものしかない場合は、ネットワークを選択したのち、「DHCPサーバー(D)」をクリック、「サーバーを有効化」にチェックを付ける、「適用」を押下する、の順に操作してください。

ネットワーク設定3

次に下図のようにサーバの電源が「オフ」になっていることを確認し、サーバーを選択してください。 その後「設定」、「アダプター2」の順でクリックし、「ネットワークアダプターを有効化(E)」にチェックをしてください。 割り当て(A)に「ホストオンリーアダプター」、名前(N)に先ほどのネットワークを選択し、「OK」ボタンを押してください。 これでサーバーに対してネットワークを割り当てました。

ネットワーク設定4

もう一つのサーバーについても、同じように「設定」ボタンをクリックし、ネットワークを割り当ててください。

次に二つのサーバーを起動してください。起動後、ユーザー名とPWを入力し、以下のようにログインシェルが起動したところまで準備してください。 これからは下図に図示したとおり、左側のサーバーから右側のサーバーにSSHで接続することにします。 また便宜的に、SSHで接続する左側のサーバーを「クライアントサーバー」、SSHで接続される右側のサーバーを「ターゲットサーバー」と呼ぶことにします。

クライアントとターゲット

SSHでリモートログインするには、以下の書式でコマンドを実行します。

ssh <オプション> <接続先>

「接続先」にはターゲットサーバーのIPアドレスを指定すればよいです。

ターゲットサーバーのIPアドレスは以下のコマンドで確認することが出来ます。 現時点では少し難しいですが、以下のコマンドをそのまま丸写しして、ターゲットサーバーのシェルから実行してください。

 $ ip addr | grep inet

すると、以下のように表示されます。 筆者の環境では、下図中の「192.168.56.102」という部分がターゲットサーバーのIPアドレスです。 このIPアドレスは皆様の環境でも同じとは限りませんので、ご自身の確認した番号を分かるようにしておいてください。

ipアドレス確認

最後の準備としてターゲットサーバーで以下を実行してください。

 $ echo This is a Target Server >> target.txt

クライアントサーバーから今作成したファイルの中身を閲覧することを目標とします。

クライアントサーバーからターゲットサーバーにSSHで接続します。 クライアントサーバーのシェルから以下を入力して実行してください。 IPアドレスは、皆様ご自身が確認した番号に書き換えて入力してください。

 $ ssh 192.168.56.102 

実行するとクライアントサーバー側でのログインパスワード入力を求められます。 正しいパスワードを入力すると、SSHでの接続が成功するはずです。

本当にリモート接続が出来たのか確認しましょう。 以下のコマンドを実行してください。

 $ cat target.txt
This is a Target Server

ターゲットサーバー内にあるファイルの中身を、クライアントサーバーから確認することが出来ました。

最後に、シェルから$ exitと入力し、SSH接続を終了してください。

終わりに

以上で本レッスンは終了です。とても沢山のボリュームでしたがお疲れさまでした。 本レッスンの最後では、SSHでリモートのサーバへ接続することを、実際に試してみました。 次のレッスンでは、リモート接続を安全に行うための技術という観点で、学習を深めていきます。