「新しいLinuxの教科書」(Chapter 0〜11)からの学び

Linux

技術書を読んでブログで定期的(できたら毎週💦)アウトプットすることを目標にしております🏃

今回は第3弾として、新しいLinuxの教科書のChapter 0〜11を読んで学んだことや、本をきっかけに自分で調べたことをまとめてみました💡

実務未経験者の学習内容アウトプットですので、おかしな点等あればご指摘いただけますと幸いです🙇‍♂️

学んだこと

Linuxとは?

オペレーティングシステム(コンピューターが動作するための基盤となるソフトウェア)の一種

Linuxの特長

  1. オープンソース
    誰でもソースコードを無料で閲覧、改良、共有できる。
  2. カスタマイズ性
    Linuxは非常に柔軟で、ユーザーの要望に合わせて多くの部分をカスタマイズできる。
    インターフェースの外観からシステムの動作まで、細かく設定を変更できる。

Linuxカーネルとは?

Linuxカーネルは、OSの中心部で、ハードウェアとソフトウェアの間のコア機能を提供する。
カーネルは以下のような重要な役割を担っている。

  1. リソース管理
    メモリ、CPU、ストレージなどのコンピュータリソースの管理と割り当てを行う。
  2. プロセス管理
    プログラムがシステム上で実行される際に、そのプロセスを管理する。
  3. デバイス管理
    外部デバイス(キーボード、マウス、プリンターなど)との通信を管理する。
  4. ファイルシステム管理
    データの保存、読み込み、削除など、ファイルシステムの操作を制御する。

シェルとは?

ユーザーとOSとの間のインターフェース。
シェルを使うことで、キーボードからコマンドを入力し、OSに指示を出すことができる。
これは、ファイルの操作、プログラムの実行、システムの管理など、多くのタスクを実行するための手段である。

シェルの種類

  1. bash
    最も一般的に使われているシェル。ユーザーフレンドリーで、スクリプト記述が容易。
  2. tcsh
    C言語風の構文を持つシェル。複雑なスクリプト記述が可能。
  3. zsh
    bashに似ているが、拡張機能やカスタマイズ性に富む。インタラクティブな機能が豊富。
  4. sh
    Unix系オペレーティングシステムにおいて、古くから基本的なシェルとして利用されている。
    シェルスクリプトを書く際に利用するのが現在でも一般的だが、対話的に使うのに不便で、ログインシェルとして使用されることは少ない。

シェルとカーネルの関係

ユーザーがシェルを通じてコマンドを入力すると、シェルはそのコマンドを解釈し、カーネルに指示を出す。
カーネルはこれらの指示に基づいてハードウェアやシステムリソースを操作し、必要なタスクを実行する。

シェルとカーネルが分かれている理由

  1. セキュリティと安定性
    • カーネルはシステムの安定性とセキュリティを担っている。カーネルを直接操作すると、システムの安定性に影響を及ぼす可能性がある。
    • シェルが仲介役として存在することで、不適切なコマンドや危険な操作がカーネルに直接影響するのを防ぐ。
  2. 利便性とユーザビリティ
    • シェルはユーザーフレンドリーなインターフェースを提供し、一般のユーザーが直感的にシステムを操作できるようにする。
    • カーネルとの直接的な対話は複雑で理解しにくいため、シェルを通じて簡単なコマンドで操作できるようになっている。

ターミナルとシェルの違い

ターミナルはユーザーがコマンドを入力し、コンピューターとやり取りするためのインターフェース。
一方、シェルはそのコマンドを解釈し、オペレーティングシステムに指示を出すプログラムである。
ターミナルは「入出力の場」、シェルは「コマンドを処理するプログラム」。

シェルの便利な機能

カーソル移動コマンド
コマンド内容
Ctrl + aカーソルを行の先頭に移動 
Ctrl + eカーソルを行の末尾に移動
Ctrl + fカーソルを一文字右に移動
Ctrl + bカーソルを一文字左に移動
Esc → fカーソルを一単語右に移動
Esc → bカーソルを一単語左に移動
文字の削除、カット、ヤンク(貼り付け)コマンド
コマンド内容
Ctrl + dカーソル位置の文字を削除
Ctrl + hカーソル位置の直前の文字を削除
Ctrl + wカーソル位置から単語の先頭までをカット
Esc → dカーソル位置から単語の末尾までをカット
Ctrl + uカーソル位置から行頭までをカット
Ctrl + kカーソル位置から行末までをカット
Ctrl + y最後にカットされたテキストをヤンク(貼り付け)
コマンド履歴の操作
コマンド内容
Ctrl + p前のコマンド履歴へ移動(矢印キーの上と同じ)
Ctrl + n次のコマンド履歴へ移動(矢印キーの下と同じ)
補完機能

コマンドライン上で部分的に入力されたコマンドやファイル名を自動的に完成させる機能。
コマンドの最初の数文字を入力した後に Tab キーを押すと、シェルは入力された文字列にマッチするコマンド名を補完しようとする。例えば、「cd Doc」 と入力して Tab を押すと、「cd Documents 」などに補完される。
また、入力した文字列に複数の補完候補が存在する場合、Tab キーを2回押すと、マッチする全ての候補が表示される。
上記の通り、長いコマンドやファイル名を全て手動でタイピングする必要がなくなり、時間の節約とタイプミスの減少に役立つ。

インクリメンタルリサーチ(逐次検索)

ユーザーが検索語を入力すると、すぐにそれにマッチする結果を表示する検索技術。
これにより、ユーザーは全ての文字を入力しきらなくても、途中で検索結果を確認しながら、目的の項目を見つけやすくなる。
コマンドラインでのインクリメンタルリサーチは、過去に入力したコマンドを迅速に見つけ出すのに有効。

  1. リサーチの開始
    Ctrl + r を押すと、インクリメンタルリサーチモードが開始される。
  2. 検索語の入力
    検索したいコマンドの一部を入力する。入力するたびに、シェルは履歴を検索して、入力した文字列に最も近いコマンドを表示する。
  3. コマンドの選択
    目的のコマンドが表示されたら、その場で Enter を押して実行するか、編集のために 右矢印キー または 左矢印キー を押す。
  4. リサーチの終了
    Ctrl + g を押すと、インクリメンタルリサーチモードを終了し、通常のコマンドライン入力に戻る。

ファイル操作

lessコマンド

ファイル内容のスクロール表示

lessコマンドを使用すれば、ファイルの内容をページ単位で表示可能。(例:less filename.txt)
特に大きなファイルや長いログファイルを閲覧する際に便利。
スクロールを操作するコマンドは下記の通り。

コマンド内容
f一画面分を前方(下方)へスクロール
b一画面分を後方(上方)へスクロール
j一行下へスクロール
k一行上へスクロール
qless を終了し、コマンドラインに戻る
ファイル内の検索

lessコマンドでファイルを開いた後、/ キーを押してから検索したい文字列を入力すると、指定した文字列をファイル内から検索可能。
例えば、「less filename.txt」実行後に「/error」と入力すると、filename.txt 内の「error」という単語を検索する。

コマンド内容
/ 文字列ファイル内で前方向の文字列検索
? 文字列ファイル内で後方向の文字列検索
n検索結果の次の項目へ移動
N検索結果の前の項目へ移動

シンボリックリンクとは?

あるファイルやディレクトリへの参照(「ショートカット」のようなもの)。
実際のファイルやディレクトリではなく、それらを指し示す「ポインタ」のようなもので、特徴は下記の通り。

  1. 参照先のパス
    • シンボリックリンクは、別のファイルやディレクトリへのパスを保持する。
  2. 独立性
    • シンボリックリンクは、リンク先のファイルやディレクトリとは独立して存在する。リンク先が削除されても、シンボリックリンク自体は残るが、「壊れたリンク」になる。
  3. リンク先の透明性
    • シンボリックリンクを通じてファイルやディレクトリにアクセスすると、ユーザーはリンクを経由していることに気づかない場合が多い。システムはリンクを自動的に追跡して、実際のファイルやディレクトリにアクセスする。

シンボリックリンクを作成するには、ln コマンドに -s オプションを使用する。例は下記の通り。

ln -s /path/to/original /path/to/link

上記の「/path/to/original」はリンク先の実際のファイルやディレクトリ、「/path/to/link 」は作成するシンボリックリンクのパス。

Vim

Vimは、Unix系オペレーティングシステムで広く使用されるテキストエディタの一つ。
Vimは「Vi IMproved」の略で、Viエディタの拡張版として開発された。

Vimの特徴

  • モーダルエディタ
    Vimはモードを持つエディタで、主に「ノーマルモード」、「挿入モード」、「コマンドモード」がある。
  • カスタマイズ可能
    多くの設定やプラグインにより、ユーザーのニーズに合わせてカスタマイズできる。
  • キーボード中心の操作
    マウスをほとんど使用せず、キーボードだけで高速な編集が可能。

Vimのモード

  1. ノーマルモード:テキストの移動や編集コマンドを入力するモード。
  2. 挿入モード:テキストを挿入するモード。
  3. コマンドモード:ファイルの保存やVimの設定を行うコマンドを入力するモード。

よく使用するVimコマンド

コマンド内容
i挿入モードに入る
escノーマルモードに戻る
:wファイルを保存
:qVimを終了
:wq保存して終了
dd行を削除(ノーマルモード)
yy行をコピー(ノーマルモード)
pペースト(ノーマルモード)
/ 文字列した方向に向かって文字列を検索
h, j, k, l左、下、上、右へ移動(ノーマルモード)

bashの設定

エイリアス

長いコマンドや頻繁に使用するコマンドシーケンスに短い名前を割り当てる機能。

例:llls -l のエイリアスとして設定する

alias ll='ls -l'

この設定により、ll と入力するだけで ls -l コマンドを実行できる。
エイリアスは一時的で、シェルを終了すると消失する。永続的にするには、ユーザーの .bashrc ファイルに追加する。

シェル変数

現在のシェルセッションまたはスクリプト内で定義され、利用される変数。これらは組み込みコマンド(シェル自体に組み込まれているコマンド)によってのみ扱われ、外部コマンド(シェルの外部で実行される独立したプログラム)からは参照できない。

環境変数

現在のシェルセッションだけでなく、その子プロセスにも引き継がれる変数。これにより、シェルスクリプトや外部コマンドがこれらの変数を利用できる。

ファイルパーミッション

Linuxのファイルパーミッションには、通常、以下の3つのタイプがある。

  1. 読み取り(Read)
    • r で表され、ファイルを読み取る権限を意味する。
  2. 書き込み(Write)
    • w で表され、ファイルの内容を変更する権限を意味する。
  3. 実行(Execute)
    • x で表され、ファイルをプログラムとして実行する権限を意味する。

これらのパーミッションは、ファイル所有者、所有者のグループメンバー、その他のユーザーに対して個別に設定される。

パーミッションの表示と例

ファイルのパーミッションを確認するには、ls -l コマンドを使用し、出力は次のようになる。

-rw-r--r-- 1 user group 4096 Jan 1 12:00 example.txt

この例では、example.txt というファイルについて以下のようなパーミッションが設定されている。

  • rw-:所有者(user)は読み取りと書き込みの権限がある。
  • r--:所有者のグループ(group)には読み取りの権限のみがある。
  • r--:その他のユーザーにも読み取りの権限のみがある。

パーミッションの変更

パーミッションは chmod コマンドを使用して変更できる。

例えば、所有者に実行権限を追加するには

chmod u+x example.txt

グループとその他のユーザーに書き込み権限を削除するには

chmod go-w example.txt

スーパーユーザ

Linuxにおけるスーパーユーザ(通常「root」と呼ばれる)は、システム上で全てのファイルやコマンドにアクセスし、変更することができる最高権限のユーザである。
スーパーユーザはシステム管理や設定の変更、保護されたファイルの編集など、通常のユーザーには許可されていない操作を行うことができる。

スーパーユーザの特徴

  • 全権限:システムのどのファイルやディレクトリにもアクセスでき、変更できる。
  • システム管理:システムの設定を変更したり、システム全体に影響を及ぼすコマンドを実行したりできる。
  • リスク:スーパーユーザーの権限は非常に強力であるため、誤った操作はシステムに深刻なダメージを与える可能性がある。

スーパーユーザになる方法

  1. su コマンド
    • su コマンドを使ってスーパーユーザに切り替えることができる。
    • コマンド実行後、スーパーユーザのパスワードを入力する必要がある。
  2. sudo コマンド
    • sudo コマンドを使って一時的にスーパーユーザの権限でコマンドを実行できる。
    • 例:sudo apt update(パッケージリストの更新をスーパーユーザ権限で実行)

注意点

  • スーパーユーザ権限を持つことは大きな責任を伴う。誤ったコマンドの実行はシステムを破壊する可能性があるため、慎重に操作する必要がある。
  • 日常的な作業では、通常のユーザー権限を使用し、必要なときのみスーパーユーザ権限を使用することが推奨される。

プロセスとジョブ

プロセス(Process)とは?

  • 定義: プロセスは、メモリ上で実行中のプログラムのこと。オペレーティングシステムによって管理され、独自のメモリ領域、環境変数、プライオリティなどを持っている。
  • 特徴:
    • Linux システム上で実行されるすべてのプログラムはプロセスとして実行される。
    • 各プロセスには一意のプロセスID(PID)が割り当てられる。
    • プロセスは親子関係を持ち、他のプロセスから派生することができる。

ジョブ(Job)とは?

  • 定義: ジョブは、シェルによって管理される一つまたは複数のプロセスのグループ。ジョブはユーザーがシェルから開始したコマンドやプログラムによって形成される。
  • 特徴:
    • ジョブは、通常、ユーザーのインタラクティブなセッションの中で管理される。
    • ジョブはシェルのコンテキスト内でのみ意味を持ち、シェルが終了するとそのジョブも終了する。

プロセスとジョブの違い

  • スコープ: プロセスはOS全体で実行され管理されるが、ジョブは特定のシェルセッションに関連づけられる。
  • 管理: プロセスはカーネルによって管理され、ジョブはシェルによって管理される。
  • 構成: 単一のプロセスは一つの実行単位だが、ジョブは複数のプロセスを含むことができる。

標準入出力とパイプライン

Linuxシステムにおける標準出力、標準入力、標準エラー出力は、プログラムがデータをやり取りするための基本的な方法である。これらは、プログラムの実行中に情報を受け取ったり、出力したりする際に使われる。

標準入力(stdin)

プログラムにデータを供給するための主要な方法。通常、キーボードからの入力が標準入力としてプログラムに渡される。

標準出力(stdout)

プログラムが処理結果や他の情報を出力するために使用される。デフォルトでは、標準出力はコンソールまたはターミナル画面に表示される。

標準エラー出力(stderr)

プログラムのエラーメッセージや警告を出力するために使われる。これもデフォルトではコンソールやターミナルに表示される。

リダイレクト

標準入出力先を変更する機能のこと。

  1. 標準出力のリダイレクト
    • >>> を使用して、コマンドの標準出力(通常は画面に表示される出力)をファイルにリダイレクトする。
    • 例:ls > filelist.txt は、ls コマンドの出力を filelist.txt ファイルに保存する。
  2. 標準エラー出力のリダイレクト
    • 2> を使用して、エラーメッセージをファイルにリダイレクトする。
    • 例:command 2> error.txt は、command のエラーメッセージを error.txt に保存する。
  3. 標準入力のリダイレクト
    • < を使用して、ファイルの内容をコマンドへの入力としてリダイレクトする。
    • 例:sort < file.txt は、file.txt の内容を sort コマンドへ入力する。

パイプライン

あるコマンドの出力を直接別のコマンドの入力として渡すために使用される機能。
パイプラインを使用することで、複数のコマンドを組み合わせて複雑なタスクを実行できる。
パイプラインは、縦棒「 | 」を使用して表される。この記号は、左側のコマンドの標準出力を右側のコマンドの標準入力に接続する。

パイプラインの使用例
  1. シンプルな例
    • ls | grep "txt":このコマンドは、現在のディレクトリのファイル一覧(ls コマンドの出力)から “txt” を含む行だけを抽出する(grep "txt" によるフィルタリング)。
  2. 複数のコマンドを組み合わせる
    • cat file.txt | grep "example" | sort:このコマンドは、file.txt の内容を表示し(cat file.txt)、”example” という文字列を含む行だけを抽出し(grep "example")、それらをソートする(sort コマンド)。
パイプラインの利点
  • パイプラインを使用すると、一時ファイルを作成せずに複数のコマンドを連鎖させることができる。
  • 異なるコマンドを組み合わせて、多様な処理を行うことが可能。
パイプラインの注意点

パイプラインを構築する際は、各コマンドが互いに互換性を持つように注意する必要がある。つまり、一つのコマンドの出力が次のコマンドの期待する入力形式である必要がある。

感想など

  • 聞いたことはあるものの中身があまりわかっていなかったこと(シェル、エイリアス、環境変数、スーパーユーザ、プロセス、ジョブ、パイプライン、リダイレクト等)について、理解を深めることができて良かった。
  • コマンドライン操作の実例が豊富に含まれていて、実際に自分のPCで試しながら学べたのが良かった。
  • これまでコマンドラインを編集する際、カーソル移動を矢印で行っていたり、行の一括削除をするためにdeleteキーを複数回押していたり、補完機能を使っていなかったり等、かなり非効率な方法で行っていたが、書籍の内容を学習することで効率的な機能やコマンドを沢山知ることができた。
  • 書籍内では、VirtualBoxでLinux環境を用意する方法が記載されているが、M1 macでVirtualBoxを使おうとすると色々めんどくさそう(そもそも無理?)だったので、この記事を参考にさせていただきながら、DockerでCentOS環境を用意した。

コメント

タイトルとURLをコピーしました