🤖

徹底解説!Linuxに関する基礎知識とコマンド

2024/06/26に公開

Linuxってなに?

  • OSの一種で、コンピューターを動かすための基本ソフト。
  • 有料のUnixが、Linuxという形で無料で使えるようになった。
  • 現在は大変普及しており、サーバー、組み込み、デスクトップなど幅広い用途で使われている。
  • 特徴
    • オープンソースなので、誰でも自由に使える。
    • 品質の高い多くのソフトウェアが利用できる。
  • 欠点
    • 商用アプリケーションがあまり存在しない。
    • 日本語対応されていない部分が多い。

なぜ学ぶのか

  • サーバー用、組み込み器用などの幅広い場所で使われており、そういった場所でマシンを操作する時に必要。
  • 長い時間をかけて、多くのユーザーに検証された結果、大きく変更する必要がないため、一度習得すれば、何年も使える。

Linuxディストリビューションってなに?

  • カーネル:OSの中核となるソフトウェア
  • ディストリビューション:カーネルにいろいろなソフトウェアを組み合わせて使いやすくしたもの。
  • ディストリビューションは1000種類以上あり、独自のコミュニティが開発している。
  • Red Hat系とDebian系が主流

シェル

  • LinuxのCLIを提供するソフトウェア
  • ユーザーとLinuxカーネルの仲介役(カーネルのインターフェース)としている。(CLI:キーボードからコマンドを入力し、文字列として結果を出力するインターフェース)
  • ユーザー名、ホスト名、プロンプトがシェルでは表示されている。プロンプトは入力待ちの記号。
[username@localhost ~] $

シェルの仕組みは、

  1. ユーザーがプロンプトにコマンド入力
  2. シェルが入力されたコマンドを探す
  3. Linuxカーネルが見つかったコマンドを実行
  4. シェルが実行結果を画面に表示
  • Linuxを操作するときはターミナルにコマンドを入力する。ターミナルの中でシェルが動いているので、ターミナルとシェルは別物。
    • ターミナル:画面を提供するソフトウェア
    • シェル:コマンドを解釈するソフトウェア

シェルの種類

種類 説明
sh ・最も古いシェル
・ほぼすべてのUnixで利用できる標準的なシェル
・機能は少ない
bash ・shを基本として機能を拡張したシェル
・Linux環境でデフォルトのログインシェル
・Linux環境でデフォルトのログインシェル
zsh ・bashの機能を取り込み、独自の拡張も追加
・機能の豊富なシェル

カーネルとシェルが分かれていたり、シェルとターミナルが分かれているように、Linuxは「1つのプログラムには1つのことをうまくやらせる」「色々な機能をできるだけ細かく切り分けて作る」という設計思想がある。

シェルの便利機能

カーソルの移動

コマンド 内容
Ctrl + f 1文字次へ移動
Ctrl + b 1文字前へ移動
Ctrl + a 行の先頭に移動
Ctrl + e 行の最後に移動
Meta + f (esc + f) 1単語次へ移動
Meta + f (esc + f) 1単語前へ移動

文字列の編集

コマンド 内容
Ctrl + h カーソルの左を1文字削除
Ctrl + d カーソル部分を1文字削除
Ctrl + w カーソル位置の単語を削除(カーソルの前部分)
Ctrl + u カーソルの位置から行頭まで削除
Ctrl + k カーソルの位置から行末まで削除
Ctrl + y 最後に削除した内容を挿入

トラブル時の対応

コマンド 内容
Ctrl + c 実行中のコマンドを強制終了
Ctrl + l 画面の消去、文字化けしたときのクリア。Ctrl + s
Ctrl + q 画面表示のロック解除

補完・コマンド履歴

コマンド 内容
Tab コマンドのパスの補完
Ctrl + p、または↑キー1つ前の履歴を見る Ctrl + n、または↓キー1つ後の履歴を見る
Ctrl + r コマンド履歴のインクリメンタル検索(下記コマンド参考)
①文字の入力 コマンド履歴から検索
②Ctrl + r 1つ前の検索結果へ移動
③Enterキー 現在の検索結果を実行
④Escキー 現在の検索結果を表示したままコマンドラインに戻る
⑤Ctrl + g 検索結果を破棄し、コマンドラインに戻る

ディレクトリ操作について

ディレクトリ構造について

  • ディレクトリ:ファイルが保存されている場所。WindowsやMacのフォルダと同じ概念。
  • Linuxのディレクトリ構造は、ルートディレクトリを頂点とした階層構造(ディレクトリツリー)になっている。
  • Windows:ドライブから入れ子構造がはじまる。
  • Linuxは1つのディレクトリ(/)からはじまる。

主要なディレクトリの役割

ディレクトリ 役割
/bin 一般ユーザーおよび管理ユーザーの両方が使用するコマンドの実行ファイルを格納
・特に、Linuxの動作に最低限必要な重要度の高いコマンドの実行ファイルを格納
/dev ・デバイスファイル(ハードウェアをファイルとして扱うようにしたファイル)を格納
/etc ・設定ファイルを格納
・Linuxで動作するアプリケーションの設定ファイルや、Linux自体の設定に関わるファイルが置かれている
/home ・ホームディレクトリ(Linuxのユーザーごとに割り当てられる個人用ディレクトリ)が配置される
/sbin ・管理ユーザー向けのコマンド実行ファイルを格納
/tmp ・一時的なファイルを格納
・アプリケーションの実行中に結果を一時的にファイルとして保存する場合に使用
/usr ・各種アプリケーションと、それに付随するファイルを格納
/var ・変化するデータを格納
・アプリケーションを動作する上で作成されたログなどを格納

cdコマンド

  • ディレクトリを移動するコマンド
  • change directoryの略

使い方

~ $ cd [オプション] [ディレクトリ]

# 具体例
~ $ cd /home/hanako/

特別なディレクトリの指定

ディレクトリ 意味 指定方法
カレントディレクトリ 現在自分がいるディレクトリ 「.」
親ディレクトリ 1つ上の階層のディレクトリ 「..」
ホームディレクトリ ユーザーごとに割り当てられる個人用ディレクトリ 「/home/ユーザー名」
ディレクトリ ルートディレクトリ 「/」
ディレクトリ ルートディレクトリ 「/」

pwdコマンド

  • カレントディレクトリを表示するコマンド
  • print name of working directoryの略

使い方

~ $ pwd [オプション]

# 具体例
~ $ pwd /home/hanako/

lsコマンド

  • ファイルやディレクトリの一覧を表示するコマンド
  • listの略

使い方

~ $ ls [オプション] [ディレクトリ・ファイル名]

# 具体例
~ $ ls /
bin dev home lib64 mnt

# 複数のディレクトリを指定することもできる
~ $ ls / /dev
/:
bin dev home lib64 mnt
/dev:
autofs block bsg bus

パス名展開を使うと複数のファイルを一度に指定できる

記号 意味
* 任意の文字列
? 任意の1文字
# 具体例
# 拡張子がhtmlのファイルの一覧を表示
~ $ ls *.html
index.html home.html job.html

# zから始まり4文字で終わるファイルを表示
~ $ ls /bin/z???
/bin/zcat /bin/zcmp /bin/znew
  • オプション:ハイフンに記号を続ける形の引数。コマンドの動作を変えられる。
    • コマンド後ろにスペース区切りで指定。
    • 2つ以上指定できる。
    • オプションとコマンドの引数を同時に指定できる。
    • オプションが引数を取ることもある。
    • 「--」で始まるロングオプションもある。

よく使うオプション

  • 「-l」:ファイルの詳細情報を表示。(ファイルタイプ・モード、リンク数、所有者などの情報)
~ $ ls -l
drwxr-xr-x 2 hori hori 6 8月 6 11:55 dev
  • 「-a」:隠しファイルも含めたすべてのファイルを表示。
~ $ ls -a
. .bash_history .bashrc desktop
  • 「-F」:ファイル種別を表示。
~ $ ls -F
bin@ dev/ home/ lib64@

「/」:ディレクトリ、「@」:シンボリックリンク、「*」:実行可能ファイル、記号なし:通常ファイル

mkdirコマンド

  • ディレクトリを作成するコマンド
  • make directoryの略

使い方

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

# 具体例
# codeディレクトリを作成
~ $ mkdir code

オプション

  • 「-p」:深いディレクトリを一度に作成する。
~ $ mkdir -p test/2022/08

-pオプションをつけると、test, 2022というディレクトリを事前に作らなくて良い

rmdirコマンド

  • 空のディレクトリを削除するコマンド
  • remove directoryの略

使い方

~ $ rmdir <ディレクトリ名>

# 具体例
~ $ rmdir code

パスについて

  • パスは、ディレクトリやファイルの住所情報。
  • ディレクトリの階層の区切りを「/」で表現する。
/home/hanako
  • 絶対パス:ルートディレクトリ「/」から始まるパス。
  • 相対パス:カレントディレクトリから始まるパス。

例:
絶対パス

/home/hanako/code/README.md

相対パス

code/README.md

ファイル操作について

catコマンド

  • ファイルの中身を表示するコマンド
  • concatenateの略

使い方

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

# 具体例
~ $ cat /etc/hosts
127.0.0.1 localhost
::1       localhost6

オプションや使い方

  • 「-n」:行番号を表示するオプション
# ファイルの詳細情報を表示
~ $ cat -n /etc/hosts
1 127.0.0.1 localhost
2 ::1       localhost6
  • 使い方:複数のファイルをまとめて表示することもできる
# 一度に複数のファイルを指定するとファイルの内容が順に表示される。
~ $ cat /etc/hostname /etc/hosts
local.localdomain     # /etc/hostnameの内容が
127.0.0.1 localhost   # /etc/hostsの内容
::1       localhost6         ↓

lessコマンド

  • ファイルの中身をスクロール表示するコマンド
  • 長いファイルの中身を見たい時に使うコマンド
less - opposite of moreの略

使い方

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

# 具体例
~ $ less /etc/vimrc
if v:lang = ~ ...

スクロール操作

コマンド 内容
スペースキー、f 1画面したにスクロール
b 1画面上にスクロール
j 1行下にスクロール
k 1行上にスクロール
q lessコマンドを終了
/<文字列> 下方向に向かって検索
?<文字列> 上方向に向かって検索
n 次の検索結果に移動
N 前の検索結果に移動

テキストファイルについて

  • 文字コードで定められた文字だけが並んで格納されているファイル
  • 文字コード:文字をコンピューターで処理したり通信したりするために、文字の種類に数値を割り振ったもの
  • 例:Aは「10000001」、Bは「10000010」など
  • Linuxではテキストファイルは重要。OSに関わるほとんどの設定情報をテキストファイルとして管理している。

バイナリファイルについて

  • 画像ファイルや音声ファイル、実行ファイルなど文字コード以外の数値も含むようなファイル(テキスト以外のファイル)
  • catコマンドなどでバイナリファイルが文字化けするのは、無理やりテキストファイルとして解釈しようとして、文字コードに該当した数値をその文字に置き換えて表示して意味不明になっているから

touchコマンド

  • 空のファイルを作成するコマンド(ファイル名が存在していないときは空のファイルを作成して、存在しているときはタイムスタンプを更新する)
  • touchの略

使い方

~ $ touch <新規ファイル名1> <新規ファイル名2> ...

# 具体例
~ $ touch README.md

rmコマンド

  • ファイル・ディレクトリを削除するコマンド
  • ゴミ箱に行くのでなく、完全に削除される
  • removeの略

使い方

~ $ rm [オプション] <削除するファイル名1> <削除するファイル名2> ...

# 具体例
~ $ rm README.md

オプション

  • 「-r」:ディレクトリをあわせて削除する(中のファイルやディレクトリもまとめて削除される)
~ $ rm -r dir
  • 「-f」:ファイルを削除する際に警告文を表示しない
~ $ rm -f file
  • 「-i」:ファイルの削除前に確認する
~ $ rm -i dir

mvコマンド

  • ファイルの移動、ファイル名を変更するコマンド
  • moveの略

使い方

~ $ mv [オプション] <移動元>... <移動先>

# 具体例
~ $ mkdir dir
~ $ touch file

# ファイル名を変更
~ $ mv file file1

# ファイルを移動
~ $ mv file1 dir/

オプション

  • 「-i」:上書きする前に確認する
~ $ rm -i file file1

cpコマンド

  • ファイル・ディレクトリをコピーするコマンド
  • copyの略

使い方

~ $ cp [オプション] <コピー元>... <コピー先>

# 具体例
# ファイルをコピー
~ $ cp file new_file

# ファイルをディレクトリ内にコピー
~ $ cp file dir

オプション

  • 「-i」:上書きする前に確認する
~ $ cp -i file new_file
  • 「-r」:ディレクトリをコピーする
~ $ cp -r dir new_dir

lnコマンド

  • Linuxではファイルに別名を付けることができ、それを「リンクを張る」という。Windowsでいうショートカットのようなもの。
    • ハードリンク
      • 1つのファイルの実体に複数の名前を付ける機能
      • 元のファイルを削除しても消えない
      • すべてのハードリンクがなくなった時に削除される
    • シンボリックリンク
      • リンク先のパス名が書かれた特殊ファイル。リンク先がファイルの実体
      • シンボリックリンクを残したままファイルの実体を削除したり、ファイルを移動すると、ファイルを参照できなくなる
  • リンクはどういう時に使うのか
    • 長いパス名を省略したい時
    • 複数バージョンを共存させ最新を区別したい時
  • ハードリンクとシンボリックリンクでは、シンボリックリンクを使うことが多い。ハードリンクはいくつか制限があり、異なるディスクをまたいで作成できなかったり、ディレクトリに対して使えない。シンボリックリンクにはそのような制限はない。
  • lnコマンドは、リンクを張るコマンド(オプションを付けないとハードリンクになる)
  • linkの略

使い方

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

# 具体例
# ハードリンクを張る
~ $ ln file1 file2

オプション

  • 「-s」:シンボリックリンクを張る
~ $ ln -s file1 file3

findコマンド

  • ファイルを検索するコマンド
  • findの略

使い方

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

# 具体例
~ $ find . -name README.md -print
./wordpress/.../README.md

検索条件

  • 「-name」:ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別する。
~ $ find . -name README.md

# ワイルドカードが使える。*を使って指定する時は''で囲うこと
~ $ find . -name '*.html' -print
  • 「-iname」:ファイル名を指定してファイルを検索。ファイル名の大文字小文字の区別はしない。
~ $ find . -iname readme.md
  • 「-type」:ファイルの種類で検索
# -type f は通常ファイル
~ $ find . -type f -print

# -type l はシンボリックリンク
~ $ find . -type l -print

# -type d はディレクトリ
~ $ find . -type d -print
  • 「-a」:複数の検索条件を指定。なお、-aは省略可。
~ $ find . -type d -a -name images -print

標準入出力とパーミッションについて

標準入出力

  • プログラムが特に何も指定されていない場合に利用するデータの標準的な入出力元
入出力 説明
標準入力 ・プログラムの標準の入力
・キーボードが通常は使われる
標準出力 ・プログラムの標準の出力
・ディスプレイが通常は使われる
標準エラー出力 ・プログラムのエラーメッセージを出力する

リダイレクトについて

  • 入出力先を変更する機能
  • 入力のリダイレクト:キーボードの代わりにファイルから入力する機能
# /etc/hostsファイルを入力元にしてcatコマンドを実行
~ $ cat < /etc/hosts
1 127.0.0.1 localhost
2 ::1       localhost6
  • 出力のリダイレクト:コマンドの実行結果を画面に表示するのではなくファイルに保存する機能
# lsコマンドの出力先をoutput.txtにして保存
~ $ ls > output.txt
  • エラー出力のリダイレクトには「2>」を使う

標準入出力の数値:OSが識別するために用いる識別子

入出力 数値
標準入力 0
標準出力 1
標準エラー出力 2
  • エラー出力のリダイレクト:エラー結果を画面に表示するのでなく、ファイルに保存する機能
~ $ ls /hoge 2> error.txt
~ $ cat error.txt
ls: /hogeにアクセスできません:
  • リダイレクトのその他の使用方法

出力とエラー出力をまとめる:まとめる場合は、出力をリダイレクトした後に「2>&1」とする

~ $ ls / /hoge > output.txt 2>&1
~ $ cat output.txt
ls: /hogeにアクセスできません:
bin boot dev etc home lib
  • リダイレクトで追記する
    • 「>」でリダイレクト指定するとファイルを上書きする。
    • 「>>」でリダイレクト指定するとファイルに追記する。
~ $ echo Hello! >> output.txt

/dev/nullについて

  • 入力先として指定しても何も返さず、出力先として指定してもデータは消え、何も表示されない、スペシャルファイル。

  • 入力先として指定

    • 入力が何もない状態になる。
    • コマンドのテストなどで入力を空にしたい時に使用。
~ $ cat < /dev/null
~ $                 # 何も表示されない
  • 出力先として指定
    • 結果が何も表示されない。
    • 結果が大量にあり、結果を非表示にしたい時に使用。
~ $ ls / > /dev/null
~ $                 # 何も表示されない

【|】パイプラインについて

  • 複数のコマンドを連携させる機能。
  • コマンドの標準出力を別のコマンドの標準入力につながる。

使い方

コマンド | コマンド

# 例
~ $ ls /bin | less
~ $ ls /bin | grep systemd | less

※ grep:指定した文字列で検索して該当するものを表示するコマンド

パーミッション

ファイルのオーナーとグループについて

  • ファイルにはすべてオーナー(所有者)とグループ(所有グループ)が設定されていて、権限管理されている。
    • 前提:Linuxではユーザーごとにアカウントを発行する。
    • オーナー:ファイルの所有者
    • グループ:ファイルの所有グループ。ユーザーをグループに所属させ、グループに権限を与えることで、複数ユーザーの権限を一括で管理できるようにする。

確認方法:「ls -l」コマンドでファイルのオーナーとグループを確認できる。

~ $ ls -l /etc/less
-rwxr-xr-x. 1 root root 123456 8月 31 2022 /bin/less

# root: オーナー 
# root: グループ

パーミッションについて

  • ファイルやディレクトリを「誰がどのように操作できるか」を定めたもの

確認方法:「ls -l」コマンドでパーミッションを確認できる

~ $ ls -l /bin/less
-rwxr-xr-x. 1 root root 123456 8月 31 2022 /bin/less

# -: ファイルタイプ
# rwx: オーナーのパーミッション
# r-x: グループのパーミッション
# r-x: その他のユーザーのパーミッション

詳細

パーミッションの記号 内容
r read(読み取り)
w write(書き込み)
x execute(実行)

rwxr-xr-xだと、

対象 読み取り 書き込み 実行
オーナー
グループ ×
その他のユーザー ×

chmodコマンド

  • ファイルやディレクトリのパーミッションを設定する
  • change modeの略

使い方

~ $ chmod [ugoa] [+-=] [rwx] <ファイル名>
記号 内容
u 所有者の権限
g グループの権限
o その他のユーザーの権限
a 全ユーザーの権限
+ 権限を追加
- 権限を削除
= 記述した権限にする
# 例
~ $ chmod u+r file

数値で指定する方法

~ $ chmod <8進数の数値> <ファイル名>

詳細

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

※rwxなら、4 + 2 + 1 で「7」のように求める。

# 例
~ $ chmod 755 file

※通常の指定:相対指定、数値指定:絶対指定。

スーパーユーザーについて

  • 管理者権限を持つ特別なユーザーがスーパーユーザー
  • システムの根幹に関わる作業が誰でもできると危険なので、そのような作業はスーパーユーザー(root)だけができるようにしている。

使い方

sudo <コマンド>
  • switch user and doの略
# 例
~ $ sudo mkdir /storage

プロセス・ジョブ管理について

プロセス

  • 実行中のプログラムのこと
  • コマンドを実行すると、実行ファイルをメモリに格納して、メモリ上でCPUがプログラムを実行する。
  • 1つ実行すると、新しいプロセスが1つ作られる。

psコマンド

  • 実行中のプロセスを表示するコマンド
  • process statusの略

使い方

  • 1行ずつが1つのプロセス。
  • PIDにプロセスID、CMDに実行中のコマンドが表示される。
~ $ ps [オプション]

# 例
~ $ ps
PID   TTY      TIME  CMD
4649  pts/0  00:00:00 ps
20193 pts/0  00:00:00 bash

オプション

  • 「aux」:全ユーザーのプロセスを、詳細情報を合わせて表示
    • x:PSコマンドを実行したユーザーのすべてのプロセス。
    • a:すべてのユーザーのプロセス。
    • u:詳細情報をあわせて表示する。
~ $ ps aux
USER    PID   %MEM   VSZ  RSS  TT  STAT
root  ~

ジョブ

  • まとめて実行されるプロセスの集まりがジョブ。シェルごとに管理される。
# プロセスが3つ生成される
~ $ ps aux | grep bash | less
# ジョブは1つ生成される

ジョブとプロセスの違い

  • プロセスはOS全体で統一して管理される。システムが自動で実行しているプログラムや他のユーザーが実行しているコマンドを一括して管理。
  • ジョブは、そのジョブを実行するシェルで管理される。

fg・bgコマンド

  • バックグラウンド:シェルの画面外でコマンドを実行すること
  • フォアグラウンド:シェルの画面内で実行すること

jobsコマンド

  • 現在のジョブの一覧を表示するコマンド。ジョブID、実行状況、実行コマンドを表示する。
  • jobsの略

使い方

~ $ jobs
~ $ jobs
[1]+   実行中   sleep 10 &

fgコマンド

  • ジョブをフォアグラウンドにするコマンド
  • ジョブをフォアグラウンドに戻して対話的に操作したい時に使う
  • foregroundの略

使い方

~ $ fg %<ジョブID>
~ $ fg %1

bgコマンド

  • ジョブをバックグラウンドにするコマンド
  • 長い時間がかかる処理をバックグラウンドで実行することで、コマンドの終了を待たなくてよい。
  • backgroundの略

使い方

~ $ bg %<ジョブID>
~ $ bg %1

killコマンド

  • ジョブやプロセスを終了させるコマンド
  • kill processの略

使い方

~ $ kill [オプション] %<ジョブID>
~ $ kill [オプション] <プロセスID>

※フォアグラウンドのジョブは、Ctrl + cで終了できる。
※停止中やバックグラウンドのジョブは、killコマンドで終了できる。

補足

  • 正確には、killコマンドはシグナルを送信するコマンド
~ $ kill -<シグナル名> <プロセスID>
  • デフォルトでは、TERMという、終了を指示するシグナルを送信している
# この2つのコマンドは同じ
~ $ kill 4649
~ $ kill -TERM 4649
  • 時々使うのはSIGKILLkという強制終了のシグナル
# この2つのコマンドは同じ
~ $ kill -SIGKILL 4649
~ $ kill -9 4649

コマンドの使い方を調べるには

  • 「--help」:コマンドのヘルプメッセージを表示。使用方法、コマンドの概要、利用可能なオプション一覧を教えてくれるので、コマンドの概要を理解したいときに使用。

使い方

~ $ <コマンド> --help

# 具体例
~ $ ls --help
使用法:ls [オプション]... [ファイル]...
  • 「man」:コマンドのマニュアルを表示。--helpより詳しいので、きちんと理解したい時に使用する。

使い方

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

# 具体例
~ $ man ls
NAME
  ls - list directory contents

~ $ man -k move # キーワードから検索もできる

最後に

参考

もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう

Discussion