🎲

Linuxの概要と主要なコマンド

2024/02/05に公開

今回はLinuxの概要と主要なコマンドについて書いていきたいと思います。

Linuxとは

LinuxとはOSの一種です。OSとはコンピューターを効率的に使うための機能を提供するソフトウェアのことです。Linuxの他にはWindowsやmacOS、AndroidやiOSなどがOSにあたります。Linuxという単語は本来OSそのものではなく、OSのコアであるカーネルのことを指しています。カーネルはコンピュータのハードウェア制御を行うソフトウェアのみを指すため、実際ユーザーが使うツールやアプリケーションは含まれません。ただそれだと不便なため、カーネルに加えて基本的なコマンドやアプリケーションを含めてユーザーが利用できるようにパッケージ化したものをLinuxディストリビューションと言います。
本来であればLinuxとはカーネルを指す単語なのですが、一般的にはこのLinuxディストリビューションを指してLinuxと呼ぶことが多くなっています。要するに一般的にOSと言われているLinuxはこのLinuxディストリビューションのことを指しているということです。Linuxディストリビューションには様々な種類があって、UbuntuやDebian、CentOSなどが特に有名です。

カーネルには指定されたプログラムを実行する機能があり、カーネルの外部のプログラムから呼び出して使えるようになっています。ただ、カーネル自体はユーザーの要望に応じてプログラムを実行する機能は提供していません。それを実現するのがシェルの役割です。

シェル

シェルとはユーザーとカーネルとの間でコマンドをやり取りするインターフェースです。シェルを通じて、ユーザーはカーネル内のプログラムを実行したり、ファイルシステムを管理したりすることができます。プログラムの実行そのものなどOSのコアな機能を提供するのがカーネルの役割で、カーネルをユーザー操作可能にするのがシェルの役割ということです。

なぜカーネルとシェルが分かれているのか

カーネルとシェルが分かれている理由には以下のようなものがあげられます。

  • カーネルに手を加えずに、シェルだけを自分に合ったものに変更できる。
  • シェルは別のOSを操作するときにも使えるので、OSが変わっても、同じシェルを使えば操作を新たに覚える必要がない。
  • それぞれが独立しているので、アップデートなどを単独で行える。
  • シェルに問題が発生してもOSのコアであるカーネルへの影響を最小限に抑えられる。
  • システムのコアであるカーネルへのインターフェースを限定することでセキュリティ面が強化される。

まとめると機能ごとにプログラムを分離することで、柔軟性や拡張性を高めていると言えるでしょう。

実際にコマンドを実行する際の流れに当てはめると、以下のように責務が分かれています。
①入力されたコマンドを受け取る(シェル)

②コマンドを探す(シェル)

③見つかったコマンドを実行する(カーネル)

④実行結果を画面に表示する(シェル)

シェルの種類

Linuxでは様々な種類のシェルを利用することができます。今回はその中でも特に使用されることの多い3つのシェルの特徴を紹介していきます。

sh

shは最も古くから存在するシェルで、Linuxに限らず多くのOSで利用できます。歴史が長く、現在でも標準のシェルとして浸透しており、シェルスクリプトを書く際は今でもshを使用するのは一般的です。ただし、古いシェルなこともあり機能が少なく、対話的に使うのは不便なので、ログインシェルとして使われることは少なくなっています。

bash

shを基本として機能拡張したシェルです。shと後方互換性を持つためshを置き換えるのにも利用できます。対話型操作を行うための機能が充実しており、多くのLinux環境でデフォルトのログインシェルとして使われており、シェルスクリプトを書くのにも向いています。

zsh

比較的新しいシェルで、他のシェルの機能を取り込み、さらに独自の拡張も加えたシェルです。機能は他のシェルに比べて非常に多く、慣れれば効率的に使用できますが、その分使いこなすには時間がかかるため中級者以上向けのシェルと言われています。

どのシェルを使うかは人それぞれですが、特に広くおすすめされるのはbashです。
理由は
・Linuxのデフォルトであり広く使われていて情報も集めやすいこと
・shと後方互換性がありsh用のシェルスクリプトをそのまま利用できること
・対話的に使うのもシェルスクリプトとして使うのにも十分な機能が備わっていること
などがあげられます。初心者にも使いやすいシェルであり、実際幅広く利用されているようです。

シェルスクリプト

シェルスクリプトとは一連のコマンドをあらかじめ記述しておくファイルのことです。単純なコマンドだけでなく、条件分岐や繰り返しといった制御構造も記述できるので、一種のスクリプト言語であると言えます。シェルスクリプトを使用するメリットには以下のようなものが挙げられます。

  • 繰り返し作業の効率化
    一度シェルスクリプトを作成しておけば、後で同じ処理を実行する際にそのシェルスクリプトを再利用できるので繰り返し行う作業を効率化することができます。
  • 再配布
    シェルスクリプトを作成すれば、それを再配布することで他の人ともシェルスクリプトを共有することができます。
  • コマンドの打ち間違いの防止
    何度も同じコマンドを打っているの打ち間違えることもありますが、シェルスクリプトに正しいコマンドを記述しておけば、コマンドを打ち間違えによるミスをなくすことができます。

以下はディレクトリ内のファイル数をカウントし、結果を表示する簡単なシェルスクリプトの例です。

# シェルスクリプトがどのシェルを使って実行されるかをOSに指示する。今回はbash。
#!/bin/bash

# カレントディレクトリを対象とする
target_directory="."

# ファイルの数をカウント
file_count=$(find "$target_directory" -type f | wc -l)

# ディレクトリの数をカウント(カレントディレクトリ自身を除く)
directory_count=$(find "$target_directory" -mindepth 1 -type d | wc -l)

# 結果を表示
echo "Number of files: $file_count"
echo "Number of directories: $directory_count"

シェルスクリプトを活用することで、タスクの自動化、効率化、カスタマイズを実現し、より生産的な作業を行うことができます。

Linuxにおけるファイルの重要性

Linuxで扱うデータは全てファイルとして扱われます。これはプログラムだけではなく、ハードディスクやキーボードなどの入出力機器にもそれぞれファイルが割り当てられており、そのファイルを通して機器を操作できるようになっています。このようにLinuxでは全ての機能がファイルとして表現されているため、Linuxにおけるファイルについて理解を深めることはとても重要です。特に重要なファイルが格納されているディレクトリについて解説していきます。

/

ルートディレクトリです。Linuxのファイルシステム階層の最上位に位置し、システム上のすべてのファイルとディレクトリの起点となります。

/bin

基本的なユーザーコマンドの実行ファイルを置くためのディレクトリです。ls、cp、mvなどのファイルが格納されています。実行ファイルは様々な場所に配置されますが、/binにはその中でもLinuxの操作に最低限必要な重要度の高いコマンドの実行ファイルが格納されています。

/dev

デバイスファイルが置かれるディレクトリです。Linuxではハードウェアデバイスをファイルとして扱います。デバイスファイルとはハードディスクやキーボードなどのハードウェアデバイスをファイルとして扱えるようにする特殊なファイルです。

/etc

設定ファイルが置かれるディレクトリです。Linuxで動作する様々なアプリケーションの設定のためには、通常テキスト形式のファイル(コンフィグファイル)が使用され、それらの設定ファイルが/etc配下に置かれます。Linux自体の設定に関わるファイルや起動スクリプトもこのディレクトリに配置されるため、Linuxを管理する上で重要なディレクトリです。

/home

ユーザーのホームディレクトリが置かれるディレクトリです。個々のユーザーのデータや設定ファイルが各自のホームディレクトリに置かれます。

/sbin

/binと同様コマンドの実行ファイルが置かれるディレクトリです。ただ/sbinにはシステム管理者ユーザー向けのコマンドの実行ファイルが置かれます。システムの起動、修復、復旧に関連するコマンド(例:fdisk、ifconfig)などが置かれます。

/tmp

一時ファイルが置かれるディレクトリです。プログラムやプロセスによって一時的に作成されるファイルが格納されます。このディレクトリ内のファイルは定期的に削除する設定となっているディストリビューションも多く、永続的に保存する必要のあるファイルの保存先として利用してはいけません。

/usr

各種アプリケーションと、それに付随するファイルが置かれるディレクトリです。アプリケーションを追加でインストールした際に実行ファイルやドキュメントなどがこのディレクトリ下に配置されます。サブディレクトリとしてbin、lib、localなどを持ちルートディレクトリと似た構造になります。

/var

変化するデータが置かれるディレクトリです。ログファイル、メールボックス、プリントキューなど、実行時にサイズが変動する可能性のあるデータが置かれます。多くのファイルが書き込まれ、容量も逼迫することが多いので管理する上で注意が必要なディレクトリです。

Linuxの一般的なディレクトリ構造は以下のようになっています。これ以外にも多くのディレクトリが存在しますが、今回は上で説明したディレクトリのみを示しています。

コマンドとは

Linuxでは様々なコマンドを実行することができます。コマンドには組み込みコマンド外部コマンドの2種類があります。組み込みコマンドはシェル自体に実装されているコマンドで、シェルのソースコード内にそのコマンドの処理が実装されているイメージです。外部コマンドは、実態は実行可能なファイルであり、コマンドを打つことでそのファイルに書かれたコードの内容が実行されるものです。ほとんどのコマンドは外部コマンドで、シェルが外部コマンドを実行するとき、どのファイルを実行すればよいか伝えるためにパスを設定します。シェルがパスに登録されたファイルを探して実行してくれるのが外部コマンドということです。

コマンドが組み込みコマンドか外部コマンドかを確かめるにはtypeコマンドを打つことで確認できます。

 ~ % type echo
echo is a shell builtin // echoコマンドが組み込みコマンドであることを表す
 ~ % type cat
cat is /bin/cat // catコマンドは外部コマンドなのでファイルのパスが表示される

シェルにあらかじめファイルの場所(=パス)を知らせるためには、そのファイルの存在するディレクトリのフルパス(コマンドサーチパス)をPATHという名前の環境変数に登録する必要があります。このように、環境変数PATHにコマンドサーチパスを設定することをパスを通すといいます。ここでのフルパスは、シェルが実行ファイルを探す際に手がかりとなるパスであることから、コマンドサーチ(検索)パスと呼ばれます。「パスを通す」のパスは、コマンドサーチパスのことを指しているのです。

プロセスとジョブ

Linuxでシェルからコマンドを実行すると、Linuxカーネルは実行ファイルを読み出してメモリに格納し、そのメモリの内容に従ってCPUがプログラムを実行します。このとき、メモリ上で実行状態にあるプログラムのことをプロセスと呼びます。カーネルから見た処理の単位であるプロセスと比較して、シェルから見た処理の単位をジョブと言います。シェルのコマンドラインに入力した1行が1つのジョブにあたります。

 ~ % ls -l | sort | head -n 10
# この場合プロセスはls -l、sort、head -n 10の3つ分生成される。
# コマンドは1行なのでジョブは1つだけ生成される。

現在動作しているプロセスを確認するには、psコマンドを使用します。引数なしでpsコマンドを使用すると、現在のターミナルで実行中のプロセスの一覧が表示されます。

 ~ % ps
  PID TTY           TIME CMD
47498 ttys001    0:00.50 -zsh
87015 ttys001    0:00.01 sleep 10
86860 ttys002    0:00.03 -zsh

通常のプロセスはユーザーが立ち上げてから何らかの処理を行ってから終了することが前提とされています。しかし、Linuxにはデーモンと呼ばれる常駐プロセスというプロセスも存在します。デーモンはユーザーからの直接的な入力を必要とせずにシステムやネットワークサービスを提供します。デーモンはシステムの起動時に自動的に開始されることが多く、システムが稼働している間ずっと動作し続けることが一般的です。デーモンの例は以下のようなプロセスが挙げられます。

  • httpd
    ウェブサーバーを提供するデーモンで、クライアントからのHTTPリクエストに応答してウェブページを提供します。
  • sshd
    SSHプロトコルを使用してセキュアなリモートログインとファイル転送を提供するデーモンです。

プロセスと同様にjobsコマンドを使用することで実行中のジョブの一覧を確認することもできます。

 ~ % jobs    
[1]  + suspended  sleep 10

主要なコマンド

ここからはLinuxで使用される主要なコマンドとその使い方について書いていきます。

cd

使い方:cd [ディレクトリパス]
カレントディレクトリを変更します。

cd /home/user/Documents  # /home/user/Documents に移動
cd ..  # 一つ上のディレクトリに移動

ls

使い方:ls [オプション] [ディレクトリパス]
ディレクトリ内のファイルやサブディレクトリの一覧を表示します。

ls  # 現在のディレクトリの内容を表示
ls -l /var/www/html  # /var/www/html の内容を詳細表示

tree

使い方:tree [オプション] [ディレクトリパス]
ディレクトリ構造をツリー形式で表示します。

tree  # 現在のディレクトリのツリー表示

cat

使い方:cat [ファイル名]
テキストファイルの内容を表示します。

cat file.txt  # file.txt の内容を表示

pwd

使い方:pwd
現在のワーキングディレクトリの絶対パスを表示します。

pwd  # 現在のディレクトリパスを表示

rm

使い方:rm [オプション] [ファイル名]
ファイルやディレクトリを削除します。

rm file.txt  # file.txtを削除
rm -r directory  # directoryディレクトリを再帰的に削除

mkdir

使い方:mkdir [オプション] [ディレクトリ名]
新しいディレクトリを作成します。

mkdir new_directory  # new_directoryという名前のディレクトリを作成

rmdir

使い方:rmdir [ディレクトリ名]
空のディレクトリを削除します。

rmdir old_directory  # old_directoryディレクトリを削除

mv

使い方:mv [オプション] [元のファイル名] [新しいファイル名またはディレクトリパス]
ファイルやディレクトリの名前を変更するか、別の場所に移動します。

mv old_name.txt new_name.txt  # ファイル名を変更
mv file.txt /home/user/  # file.txtを/home/user/に移動

cp

使い方:cp [オプション] [元のファイル名] [コピー先のパス]
ファイルやディレクトリのコピーを作成します。

cp file.txt copy_of_file.txt  # file.txt を copy_of_file.txt としてコピー
cp -r source_directory new_directory  # source_directory を new_directory として再帰的にコピー

touch

使い方:touch [ファイル名]
新しい空のファイルを作成するか、既存のファイルのタイムスタンプを現在の時間に更新します。

touch new_file.txt  # new_file.txt という新しいファイルを作成

file

使い方:file [ファイル名]
ファイルのタイプを判定します。

file image.png  # image.pngのファイルタイプを表示

ps

使い方:ps [オプション]
システム上で実行中のプロセスを表示します。

ps aux  # すべての実行中プロセスを詳細に表示

kill

使い方:kill [オプション] [プロセスID]
プロセスにシグナルを送信して終了させます。

kill -9 12345  # PID 12345のプロセスを強制終了

chmod

使い方:chmod [オプション] [モード] [ファイル名]
ファイルまたはディレクトリのアクセス権を変更します。

chmod 755 script.sh  # script.shに実行権限を付与

find

使い方:find [パス] [オプション] [検索条件] [アクション]
ファイルやディレクトリを検索します。

find /home/user -name "*.txt"  # /home/user ディレクトリ以下で、.txt で終わるファイルを検索

grep

使い方:grep [オプション] [パターン] [ファイル名]
ファイル内でパターンに一致する行を検索します。

grep "error" log.txt  # log.txt から "error" を含む行を検索

sort

使い方:sort [オプション] [ファイル名]
ファイルの内容を行単位でソートします。

sort names.txt  # names.txt の内容をソートして表示

uniq

使い方:uniq [オプション] [ファイル名]
ファイル内の重複行をフィルタリングします(通常はsortコマンドと組み合わせて使用されることが多い)。

sort names.txt | uniq  # names.txt をソートして重複行を削除

diff

使い方:diff [オプション] [ファイル1] [ファイル2]
二つのファイル間の差分を表示します。

diff file1.txt file2.txt  # file1.txt と file2.txt の差分を表示

tr

使い方:tr [オプション] [セット1] [セット2]
標準入力から文字を置換、削除、圧縮します。

echo "hello" | tr '[:lower:]' '[:upper:]'  # "hello" を大文字に変換して表示

sed

使い方:sed [オプション] 'スクリプト' [ファイル名]
テキストのストリームを編集します。

sed 's/old/new/g' file.txt  # file.txt 内の "old" を "new" に置換

cut

使い方:cut [オプション] [ファイル名]
ファイルの各行から一部のセクションを切り出します。

cut -d ':' -f 1 /etc/passwd  # /etc/passwd からユーザー名のみを切り出し

&

使い方:コマンド &
コマンドをバックグラウンドで実行します。

find / -name "example.txt" &  # "example.txt" をルートディレクトリ以下でバックグラウンド検索

最後に

今回はLinuxの概要と主要なコマンドについてまとめてみました。Linuxの基本的な知識やコマンドは開発を行う上で必須になるので、しっかり抑えていきたいです。最後までご覧いただきありがとうございました。

参考

https://www.amazon.co.jp/新しいLinuxの教科書-三宅-英明/dp/4797380942/ref=asc_df_4797380942/?tag=jpgo-22&linkCode=df0&hvadid=295706574430&hvpos=&hvnetw=g&hvrand=9639750246589708363&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009501&hvtargid=pla-523780191776&psc=1&mcid=d6c8462d70ca3cc086c2e6d1b23144df&th=1&psc=1

Discussion