Hirologue

年齢を理由にエンジニアになることを諦めないミドルの成長記録

EP 4: Linuxの勘どころ

この先、GitやらDockerを学習するわけですが、その前に学習することを避けて通れないのがLinuxです。 Linuxは技術として枯れているため、一度習得すると長く使える技術だそうです。確かに独学していたときに、 「こちらはLinuxに触れたことがある方なら理解しやすのではないでしょうか」的なフレーズを何度か耳にした記憶があります。 そこで、今回はLinuxの勘どころとして、確実に抑えなければならないであろうコマンドをまとめました。

Linuxコマンドを覚えにくいと思ってましたが、どんな単語の略なのかを理解すると驚くほど覚えやすくなります。

基本コマンド

pwd】 今どこで作業しているか知りたい

Linuxで作業を行う際には、現在自分がどのディレクトリにいるのかを把握しておかなければいけません。現在、自分がいるディレクトリのことをワーキングディレクトリ(またはカレントディレクトリ)といいます。

pwdコマンドは、print working directoryの略です。


書き方
$ pwd [オプション]

ここで、[ ]に記述する内容は必須ではありません(以下同じ)。

このコマンドを実行することで現在のディレクトリを表示してくれます。


【cd】 別のディレクトリで作業したい

自分がいるディレクトリとは別のディレクトリで作業を行う場合は、ディレクトリを変更する必要があります。

cdコマンドは、change directoryの略です。


書き方
$ cd [オプション] [ディレクトリ]

cdコマンドで、オプションはあまり使われません。
また、移動先のディレクトリを指定しない場合は、ホームディレクトリ(デフォルトのワーキングディレクトリ)に戻ります。


【ls】 ファイルやディレクトリの一覧が見たい

ワーキングディレクトリあるいは指定したディレクトリには、どのようなファイルやディレクトリが含まれているか一覧を出力するためのコマンドがlsコマンドです。

このlsコマンドはlistの略です。


書き方
$ ls [オプション] [ディレクトリまたはファイル名]

ディレクトリまたはファイル名を指定しない場合は、現在ワーキングディレクトリ内のファイルやディレクトリの一覧を表示します。

例1:ディレクトリを指定
$ ls /

例2:半角スペースで区切って複数のディレクトリを指定することもできます
$ ls / /dev


便利なワイルドカード
ワイルドカード(* や ?)を使うと任意の文字として扱われるので非常に便利です。

  • アスタリスク(*) は任意の文字列として扱われます。
    例えば、”*.html"なら拡張子.htmlがつくファイル一覧
  • クエスチョンマーク(?)は 任意の一文字として扱われます。
    例えば$ ls /bin/z??? とすると、/binディレクトリ内のzから始まる4文字のファイルを表示します。


オプションについて
lsに続けてオプションを加えることで表示される内容が変わります。
lsコマンドでは、次のようなオプションが主に使われます。

  • -a:隠しファイル(設定ファイルなど)も含めたすべてのファイルを表示します。
  • -l:ファイルの詳細情報を表示します。
  • -F:ファイル種別を表示します。


【mkdir】ディレクトリを作りたい

新しくディレクトリを作成するには、mkdirコマンドを使います。

このmkdirコマンドは、make directoryの略です。


書き方
$ mkdir [オプション] <作成するディレクトリ名>

< > で囲まれた部分の記述は必須ですので省略できません。
この場合、作成するディレクトリ名は必ず記述する必要があります。
また、作成するディレクトリ名に日本語を使用すると文字化けするおそれがあります。
したがって、作成するディレクトリ名は英語で記述します。


オプションについて


【rmdir】ディレクトリを削除したい

ディレクトリを削除したい場合には、rmdirコマンドを使います。

このrmdirコマンドは、remove directoryの略です。


書き方
$ rmdir <削除するディレクトリ名>

このコマンドは、削除しようとするディレクトリ内に何もない場合のみ実行できるコマンドです。 ディレクトリ内にファイルやディレクトリが存在するとエラーになります。

実は、後述するrmコマンドでもディレクトリの削除は実行できるので、rmdirコマンドの使用頻度はそれほど高くはないのが現状のようです。
しかしながら、rmdirコマンドを使用すれば、「隠しファイルなどがディレクトリ内に残っていることを知らずに削除してしまった」といった事故を未然に防ぐことができます。

個人の好みや開発チームの意向などでrmコマンドと使い分けるのが良いと思います。


【cat】ファイルの中身を見たい

ファイルの中身を確認するためには、catコマンドを使います。

このcatコマンドは、concatenate(連結の意)の略です。


書き方
$ cat [オプション] <ファイル名>

ファイルの中身を表示したいときに使用します。


オプションについて

  • -n:行番号を表示します。

コマンドの語源のconcatenateは「連結」という意味ですので、元々は複数のファイルの中身を表示するためのものでした。
ファイル名を半角スペースで区切って記述することで、複数のファイルの内容を表示することができます。


【less】 長いファイルの中身をスクロール表示したい

catコマンドでファイルを表示できるようになりましたが、ファイルの中身が長い場合、画面に収まりきりません。私たちがいつもWebサイトを見るように、スクロールしてファイルの中身を確認できたら便利ですよね。
そんなときに使うコマンドがlessコマンドです。

lessコマンドは何かの略ではなく、元々あったmoreと言うコマンドを使いやすくしたこともあって、moreの逆という意味でlessとなったようです。


書き方
$ less [オプション] <ファイル名>

コマンドを実行すると別のウィンドウが開いて、コマンドを待機した状態になります。
スクロール操作と検索のコマンドは以下の表の通りです。


スクロール操作

キー入力 動作
f or space 一画面下にスクロール
b 一画面上にスクロール
j 1行下にスクロール
k 1行上にスクロール
q lessコマンドの終了


検索

キー入力 動作
/ + <文字列> 下方向に向かって検索
? + <文字列> 上方向に向かって検索
n 次の検索結果に移動
N 前の検索結果に移動


【tail】 ファイルの末尾の内容を表示させたい

ファイルの末尾の情報が欲しい場面では、tailコマンドを使います。
ファイルの末尾だから、尻尾を意味するtail わかりやすいですね。


書き方
$ tail [オプション] <ファイル名>

オプションで指定しなければファイルの末尾10行の内容が表示されます。


オプションについて

  • -n [行数]:表示したい行数を指定します。
    例)$ tail -n 5 README.md : README.mdの末尾5行を表示します。

  • -f:ファイルの内容が書き換えられるとリアルタイムに表示します。
    例)$ tail -f output.log
    output.logファイルに追記されるたびに追記内容が表示されます。
    tailコマンドを終了するには、control + c を入力します。
    Linuxの運用作業などでログファイルの監視に良く使われる方法のようです。知識の一つとして留めておきましょう。


【touch】 新しくファイルを作りたい

新しくファイルを作るには、touchコマンドを使います。


書き方
$ touch <ファイル名>

ファイルが存在しない場合は、空のファイルを作成します。
一方、ファイルが存在する場合はタイムスタンプを更新します。
touchコマンドは、元々タイムスタンプを更新するいう働きを持っています。したがって、既存のファイル名を指定した場合は、間違って上書きするのを防いでくれるメリットがあります。

このようなことから新しくファイルを作成する場合には、touchコマンドが使われています。


【rm】 不要なファイルを削除したい

不要なファイルを削除するには、rmコマンドを使います。
rmdirコマンドでも触れましたが、rmコマンドでディレクトリの削除を実行することもできます(詳しくは「オプションについて」を参照してください)。

rmコマンドは、removeの略です。


書き方
$ rm [オプション] <削除するファイル名>

rmコマンドは実行すると、即時消去されます。実行後は元に戻せないので注意が必要です。


オプションについて

  • -r:ディレクトリも合わせて削除します。
    ディレクトリ内のデータやディレクトリもまとめて削除。使用時は注意を要する。

  • -f:ファイルを削除する際に警告文を表示しません。
    いかなるものでも強制的に削除してしまいます。使用する際は十分に確認を行いましょう。

  • -i ファイルの削除前に確認する。

超重要:-rf オプション
オプションで -rf を指定してコマンドを実行すると、ディレクトリ内のデータ(隠しファイルも含みます)を強制的に跡形もなく消し去ります。もちろん実行後は元に戻すことはできません。
このオプションを使用する場合には、相当の覚悟が必要です。ご注意ください。


【mv】ファイルを移動させたい / リネームしたい

ファイルやディレクトリを別の場所に移動させたり、リネームする場合にはmvコマンドを使用します。
mvコマンドは、moveの略です。


書き方
$ mv [オプション] <移動元> <移動先>

ファイルやディレクトリを移動させるかリネームするかは自動で判別されます。


オプションについて

  • -i:コマンドを実行して上書き前に確認します。


【cp】ファイル・ディレクトリをコピペしたい

mvコマンドを使うと別の場所にファイルやディレクトリを移動できましたが、cpコマンドはコピペするためのコマンドです。

cpコマンドはcopyの略です。


書き方
$ cp [オプション] <コピー元> <コピー先>

コピー先に同じ名前のファイルが存在する場合は上書き保存します。
また、ディレクトリに対してコマンドを実行するにはオプションを指定する必要があります。


オプションについて

  • -i:上書きする前に確認します。
  • -r:ディレクトリをコピーする場合に使用します。
    このオプションを指定せずにディレクトリをコピーするとエラーになります。



一歩先ゆくためのコマンド

【ln】 リンク機能を使いたい

Linuxではファイルに別名をつけることができます。
この別名をつけることを「リンクを張る」といいます。
リンクを張るコマンドがlnコマンドで、linkの略です。

また、リンクには「ハードリンク」と「シンボリックリンク」の2種類があり、次のような特徴があります。

  • ハードリンク

    • 1つのファイルの実体に複数の名前を付ける機能です。
    • 元のファイルを削除しても消えません。
    • すべてのハードリンクがなくなったときに削除されます。
  • シンボリックリンク

    • リンク先のパス名が書かれた特殊ファイルです
    • リンク先がファイルの実体です(Windowsのショートカットと似ています)
    • シンボリックリンクを削除しても元ファイルは参照できます。
    • シンボリックリンクを残したままファイルの実体を削除したり、ファイルを移動すると、ファイルを参照できなくなります。あるべき場所にファイルがなくなり、探せなくなるためです。
      このことを「リンクが壊れた」といいます。


このようなリンクを張ることで、ファイルをコピーしたり移動したりすることなく別のディレクトリにあるように扱えるようになります。

このリンクを使う利点は次の2つです。

  • 長くて複雑なパス名を省略して、入力ミスを軽減できる
  • 複数バージョンを共存させて、最新バージョンを区別できる


書き方
$ ln [オプション] <リンク元ファイル名> <リンク名>

オプションを指定しないと、ハードリンクになります。


オプションについて

ハードリンクは色々と制約が多いことから、シンボリックリンクを使うことが多いようです。

【find】 条件を指定してファイルを検索したい

その名の通り探す(ファイルを検索する)ためのコマンドです。


書き方
$ find <検索開始ディレクトリ> <検索条件> <アクション>

このコマンドは、検索開始ディレクトリを起点に検索を開始して、検索条件にヒットしたものについて指定したアクションを実行します。


検索条件について

  • -name:ファイル名の大文字小文字を区別して、ファイルを検索します。
    例)$ find . -name README.md -print

  • -iname:ファイル名の大文字小文字を区別しないで、ファイルを検索します。
    例)$ find . -iname readme.md -print

  • ワイルドカード(* や ?)が使えます。ただし、検索したいファイル名をシングルクォートで囲む必要があります。
    例)$ find . -name '*.html' -print

  • ファイルの種類で検索することもできます。
    -type f(通常ファイル)、-type l(シンボリックリンク)、-type d(ディレクトリ)



ファイルのアクセス権限や所有者の変更

Linuxは複数人が一台のコンピューターにログインして操作することが前提で作られています。
Linuxはサーバーやスーパーコンピューターなどに良く使われています。そういった環境では色んな人がログインして使っているため、それぞれが操作できると消しては行けないものを消されたり、勝手に設定を変えられたりする問題がどうしても起きてしまいます。
そのような問題を避けるために、システムの設定は管理者しかできないようになっていたり、ファイルのアクセス権限はユーザー毎に決められています。
このファイルへのアクセス権限のことをパーミッションといいます。

このパーミッションを理解していないと、サーバーで作業して、ファイルへのアクセス権限がなくてエラーが発生した場合に問題解決できずに詰んでしまうことになります。

パーミッションを確認しよう

まずは、何か適当なファイルのパーミッションを確認してみましょう。

確認するには、$ ls -l <ファイル名> を使用します。
ここでは /bin/cat ファイルのパーミッションを確認してみます。

アクセス権限と所有者

実行結果の1文字目がファイルタイプを表しています。
ファイルタイプの見方は表のとおりです。

表示 ファイルタイプ
- 通常ファイル
d ディレクト
l シンボリックリンク

ファイルタイプに続く9文字(rwxr-xr-x)をファイルモードといい、このファイルのパーミッションを表しています。
ファイルモードは3文字毎に1つのブロックとなっていて、「所有者」、「グループ」、「その他のユーザー」のパーミッションを表しています。
パーミッションは、「r」、「w」、「x」の3種類で表現されます。

表示 意味(権限)
r 読み取り(read)
w 書き込み(write)
x 実行(execute

このことから、 /bin/cat ファイルは

  • ファイルタイプは通常ファイルである
  • 所有者は、読み取り・書き込み・実行の権限がある(rwx)
  • グループとその他のユーザーは、読み取り・実行の権限があるが、書き込み権限はない(r-x)

ということがわかります。


【chmod】ファイルへのアクセス権限を変更したい

$ ls -lコマンドで表示されたファイルモードを変更して、アクセス権限を変更するにはchmodコマンドを使用します。
このchmodコマンドは、change modeの略です。

chmodコマンドの書き方は、「シンボルモード」と「数値モード」の2通りの方法があります。


書き方(シンボルモード)
$ chmod [ugoa] [+-=] [rwx] <ファイル名>

例)$ chmod u+w test.txt

記号 意味
u 所有者
g グループ
o その他のユーザー
a すべてのユーザー
記号 意味
+ 権限を追加する
- 権限を禁止する
= 指定した権限と等しくする

シンボルモードでは、指定したファイルに対して、どのユーザーに対して(u, g, o, a)、どの権限(r, w, x)をどうするか(+, -, =)がわかりやすいようになっています。
このようにシンボルモードによる変更は相対的な方法です。したがって、パーミッションの一部だけを変更したい場合に便利です。


書き方(数値モード)
$ chmod <8進数の数値> <ファイル名>

例)$ chmod 755 test.txt

パーミッション 数値
読み取り(r) 4
書き込み(w) 2
実行(x) 1

数値モードでは、所有者、グループ、その他のユーザーに与える権限を下表の数値に置き換えて、その値を足し合わせた8進数で表します。
この例では、755となっていますが、これはrwx r-x r-xを表しています。
つまり、所有者はすべて許可されているので、4+2+1=7、グループとその他のユーザーは読み取りと実行が許可されているので、4+1=5ということになります。
このように数値モードでは、元のパーミッションによらず、新しいパーミッションに変更します。

なお、このコマンドを実行できるのは、ファイルの所有者かrootユーザーに限られます。


【chown】 ファイルの所有者を変更したい

先程の$ ls -lコマンドの実行結果をもう一度見てみます。

アクセス権限と所有者

ここでは、パーミッションの表示の右側に「root」と表示されています。
これが、ファイルの所有者です(右隣はグループ)。
rootユーザーがこのファイルの所有者ということになります。

ファイルの所有者を変更するには、chownコマンドを使います。
chownコマンドは、change ownerの略です。


書き方
$ chown <変更後の所有者名> <ファイル名>

なお、このコマンドを実行できるのはrootユーザーだけです。



プロセスの確認と終了

プロセスについて

Linuxでは、実行中のプログラムのことをプロセスといいます。
コマンドを実行すると、実行ファイルをメモリに格納して、メモリ上でCPUがプログラムを実行します。
一つ実行すると、新しいプロセスが一つ作られることになり、プロセスID(PID)が付与されます。

【ps】動作中のプロセスを確認したい

現在動作しているプロセスを確認するには、psコマンドを使います。 このpsコマンドは、process statusの略です。


書き方
$ ps [オプション]

他のコマンドとは違って、psのオプションには、ハイフン(-)を付けません。

最も使うオプションは、auxで、全ユーザーのプロセスを詳細情報を合わせて表示します。
a:すべてのユーザーのプロセス
u:詳細情報を合わせて表示
x:psコマンドを実行したユーザーのすべてのプロセス


【kill】プロセス(ジョブ)を終了させたい

間違ったコマンドを実行したり、重たい処理を行ったりしてメモリやCPUを専有してしまうことがあります。
メモリやCPUを開放するためにプロセスやジョブを終了させるコマンドが、killコマンドです。 このkillコマンドは、kill processの略です。


ジョブについて
複数のプロセスを同時に処理している場合、そのまとまりのことをジョブといいます。
ジョブの一覧を表示するには、$ jobsコマンドを実行します。
コマンドを実行して[ ]内に表示される数字をジョブ番号といいます。

ユーザーが対話的に操作しながら処理が実行されているジョブをフォアグラウンド、その逆をバックグラウンドのジョブといいます。

フォアグラウンドのジョブは control+c で終了できますが、バックグラウンドのジョブに対しては、killコマンドを使わないと終了できません。


書き方
$ kill [ オプション] <プロセスID>
$ kill [ オプション] %<ジョブ番号>

正確には、killコマンドはシグナルを送信するコマンドです。
$ kill -<シグナル名> <プロセスID>

デフォルトでは、終了を指示するTERMというシグナルを送信しています。
例) $ kill 4965$ kill -TERM 4965
この2つのコマンドは同じ意味です。


状況次第ですが、「SIGKILL」という強制終了のシグナルを使うこともあります。
また、シグナルには番号も割り当てられていて、SIGKILLコマンドには9番が割り当てられています。

例えば、PIDが4965のプロセスを強制終了するには、
$ kill -SIGKILL 4965 または $ kill -9 4965とします。

この SIGKILL は最終手段として、このようなコマンドがあるということを覚えておきましょう。
イメージ的には、PCをシャットダウンせずに電源を切る行為と同じですので、無闇矢鱈と使うものではありませんので、ご注意ください。



Linuxの基本的な部分を列挙してみましたが、枯れている技術とはいえ学ぶべきことは多いですね。
ただ、Web上にはLinuxに関する情報は非常に多くありますので、気になることがあればすぐにググって調べてみるのと良いと思います。
それでは、また!