Linux学習 第3章 shellを使う

📢 この記事は gemini-3-flash-preview によって翻訳されました

第3章 shellを使う

この章で紹介する Linux shell は Bash shell と呼ばれるもので、正式名称は Bourne Again shell だよ。他にも、BSD UNIX ユーザーに人気の C shell (csh) や、UNIX System V ユーザーに普及している Korn shell (ksh) 、Ubuntu でデフォルトで起動する Dash shell (Bash より高速) 、改良版 C shell の Tcsh shell 、Bourne shell によく似た Ash shell などがあるんだ。

3.1 shell と Terminal ウィンドウ

  1. Terminal ウィンドウを使う

GUI 上でターミナルエミュレータ (Terminal ウィンドウとも呼ばれる) を実行することで、shell を起動できるよ。

だいたいのシステムは Ctrl+Shift+T のショートカットで開けるし、Fedora ならプログラム一覧から探すか、Alt+F2 を押した後に gnome-terminal と入力すればOK。

  1. 仮想コンソールを使う

GUI を備えた Linux システムの多くは、起動時に複数の仮想コンソールを動かしている。仮想コンソールを使えば、GUI 以外にも複数の shell セッションを開けるんだ。

Ctrl+Shift+F1〜F6 で仮想コンソールを切り替えられるよ。例えば Fedora だと、tty1 が gdm (ログイン画面) 、tty2 が最初のデスクトップ、tty3 が2番目のデスクトップ (テキストのみ) って感じになっている。

  • コマンドプロンプト

一般ユーザーの場合、デフォルトのプロンプトはシンプルなドル記号だよ。

$

root ユーザー (管理者) の場合は、シャープ記号 (ナンバーサインやハッシュタグとも呼ばれる) になるんだ。

#

アメリカのルーツがイギリスにあることを絶妙に表してるね(笑)

3.2 shell を選ぶ

who コマンドを使えば、今ログインしているユーザー名、仮想コンソール、ログイン時間が表示されるよ。

grep ユーザー名 /etc/passwd コマンドを叩くと、出力の最後にデフォルトで使っている shell が表示される。

ksh、tcsh、csh、sh、dash などのコマンドを入力すれば、別の shell に切り替えることもできるよ (インストールされていればの話だけど) 。

Bash shell を学ぶのは、それが多くのディストリビューションでデフォルトなだけじゃなく、ほとんどの Linux 認定試験で使われるからなんだ。

3.3 コマンドを実行する

コマンド名を入力するだけで動くものも多いけど、コマンドの後に何かを付け足して挙動を変えるのが一般的だよ。後ろに続く文字や単語は「オプション」や「引数」と呼ばれるんだ。

3.3.1 コマンドの構文を知る

  • ほとんどのコマンドには、動作を変えるためのオプションが1つ以上ある。

だいたいのオプションは1つのアルファベットで、前にハイフン - を付ける。複数のオプションを一度に使うときは、まとめて書くこともできるし、1つずつハイフンを付けてもいいよ。

単語形式のオプションもあって、その場合はダブルハイフン -- を使うのが一般的。例えば --help と入力するところを -help としちゃうと、-h 、-e 、-l 、-p という4つのオプションとして解釈されちゃうことがあるんだ。

  • また、オプションの後やコマンドラインの最後に「引数」を渡すこともできる。

引数は、ファイル名、ディレクトリ、ユーザー名、デバイスなどの追加情報のこと。コマンドラインが許容する長さなら、いくつでも引数を指定できるよ。

引数が特定のオプションと結びついている場合は、そのオプションの直後に置く必要がある。1文字オプションならスペースを空けて、単語オプションならイコール = で繋ぐことが多いかな。

例えば:

1
tar -cvf backup.tar /home/yexca

これは、「/home/yexca ディレクトリの全ファイルを backup.tar というファイル名で作成 (c) し (f) 、作成が終わったら詳細を表示 (v) する」という意味。backup.tar は f オプションの引数だから、f の直後に書く必要があるんだ。

1
ls --hide=Desktop

--hide オプションは ls コマンドに「Desktop という名前のファイルやディレクトリを表示しない」ように伝えるもの。オプションと引数の間にスペースがないことに注目してね。

  • 他にもこんなコマンドを試してみよう。

uname コマンドは実行中のシステムタイプを表示する。-a オプションを付けるとホスト名やカーネルバージョンも見られるよ。

Linux にログインすると、システムは君のユーザー名、グループ名、ユーザーID、グループID などの「識別情報」を認識する。さらに、ログイン時間やアイドル時間、どこからログインしたかも追跡しているよ。id コマンドで自分の情報を確認してみよう。

SELinux (Security Enhanced Linux) が有効なディストリビューションだと、id の出力の最後に context などの追加情報が表示されるよ。SELinux はセキュリティをガチガチに固めるための仕組みなんだ。

who -uH を使うと、アイドル時間やプロセスID (u) 、見出し (H) も表示できる。

アイドル (IDLE) は、何も入力せずに shell を放置している時間。プロセス番号 (PID) は shell のプロセスID。備考 (COMMENT) は、リモートからログインしているならそのコンピュータ名、ローカルならディスプレイ名 (*:0.0 など) が表示されるよ。

3.3.2 コマンドを探す仕組み

入力されたコマンドを実行するために、shell は「パス (PATH) 」と呼ばれる場所を探しに行く。パスに含まれていないコマンドを動かすには、フルパスで場所を指定してあげないといけない。

echo $PATH で、今の shell の環境変数 PATH を確認できるよ。

参考:Linuxのbinディレクトリについて - yexca’Blog

他のOSと違って、Linux はデフォルトではカレントディレクトリ (今いる場所) を探しに行かないんだ。すぐに PATH を検索し始める。カレントディレクトリにあるファイルを実行したいなら、PATH に追加するか、相対パスや絶対パスで指定する必要があるよ。


すべてのコマンドが PATH 内のディレクトリにあるわけじゃない。shell に組み込まれているものもあるし、エイリアス (別名) で上書きされていることもある。shell がコマンドを探す順番はこんな感じ:

  1. エイリアス (Alias):alias コマンドで設定された別名。
  2. shell 予約語:shell が特別な用途で予約している単語。
  3. 関数:今の shell 内でまとめて実行されるコマンド群。
  4. 組み込みコマンド (Built-in):cd、echo、exit、pwd、history、fg、set、type など、ファイルシステム上には存在しない shell 内部のコマンド。
  5. ファイルシステムコマンド:PATH 変数で指定されたディレクトリに保存されている実行ファイル。

コマンドがどこから来ているか知るには、type や which を使う。type -a を使えば、そのコマンドの候補を全部出してくれるよ。


もしコマンドが PATH 内に見つからないときは、locate コマンドで探してみるのも手だね。システム全体からファイルを探してくれるよ。

最近追加したばかりのファイルが見つからないときは、root ユーザーで updatedb を実行してデータベースを更新してみて。

3.4 使用命令历史记录重复执行命令

長くて複雑な、打ち間違えそうなコマンドを何度も打つのは面倒だよね。履歴を使えば楽ができるよ。

3.4.1 コマンドライン編集

デフォルトでは、Bash shell は Emacs ベースのエディタ操作が使えるようになっている。vi のほうが好きなら、ホームディレクトリの .bashrc に set -o vi を書き込めばいいよ。

  • コマンドライン移動のショートカット
キー名称意味
Ctrl+F1文字進むカーソルを右に移動
Ctrl+B1文字戻るカーソルを左に移動
Alt+F1単語進むカーソルを次の単語へ移動
Alt+B1単語戻るカーソルを前の単語へ移動
Ctrl+A行頭へコマンドラインの先頭に移動
Ctrl+E行末へコマンドラインの末尾に移動
Ctrl+L画面クリア画面を綺麗にして、カーソルを一番上へ
  • コマンドライン編集のショートカット
キー名称意味
Ctrl+D1文字削除カーソル位置の文字を消す
Backspace前の文字を削除カーソルの前の文字を消す
Ctrl+T文字を入れ替えカーソル位置と前の文字を入れ替える
Alt+T単語を入れ替えカーソル位置と前の単語を入れ替える
Alt+U大文字化単語を大文字にする
Alt+L小文字化単語を小文字にする
Alt+C先頭大文字化単語の最初の文字だけ大文字にする
Ctrl+V特殊文字挿入Tab などの特殊な文字をそのまま入力する
  • コピー&ペースト (カット&ヤンク)
キー名称意味
Ctrl+K行末までカットカーソルから後ろを全部消す
Ctrl+U行頭までカットカーソルから前を全部消す
Ctrl+W前の単語をカットカーソルの前の1単語を消す
Alt+D後の単語をカットカーソルの後の1単語を消す
Ctrl+Yペースト最後にカットしたテキストを貼る
Alt+Y過去分をペーストさらに前にカットしたものを貼る
Ctrl+C行削除今打っている内容を全部捨てる

3.4.2 コマンドライン補完

キー入力を減らすために、Bash は「補完」機能を持っているよ。文字を数個打ってから Tab キーを押すだけ。補完できるのはこんなもの:

  • コマンド、エイリアス、関数:普通の文字で始まるとき。
  • 変数:ドル記号 $ で始まるとき。
  • ユーザー名:チルダ ~ で始まるとき。~username はそのユーザーのホームディレクトリを指すよ。
  • ホスト名:アットマーク @ で始まるとき。/etc/hosts から補完される。

他のファイルからホスト名を補完したいときは、HOSTFILE 変数にそのファイルパスを設定すればいいよ。

候補が複数あるときは、Tab を2回叩けばリストが表示されるんだ。

3.4.3 コマンドの再実行

実行したコマンドは shell の履歴リストに保存されるよ。

history コマンドで一覧が見られるし、数字を付ければ直近の数件だけ表示できる。

感嘆符 ! を使うと、履歴からコマンドを直接実行できるけど、確認なしで動いちゃうから注意してね。

  • !n — 番号指定で実行。例えば !255 なら255番目のコマンドが動く。
  • !! — 1つ前のコマンドを実行。
  • !?string? — 指定した文字列を含む直近のコマンドを実行。

履歴をただ実行するだけじゃなくて、編集してから動かすこともできるよ。

キー機能説明
矢印キー または
Ctrl+P / Ctrl+N
履歴を辿る上下キーで過去のコマンドを1つずつ呼び出せる。
Ctrl+Rインクリメンタル検索過去のコマンドを文字入力で検索できる。入力するそばからヒットするよ。
Ctrl+S前方検索Ctrl+R の逆。あんまり使わないし、設定によっては効かないこともある。
Alt+P非同期検索検索文字列を入れて Enter を押すと、そのコマンドが表示される。
Alt+N前方非同期検索上記の逆バージョン。

fc コマンドを使う方法もある。fc 233 255 みたいに番号を指定すると、テキストエディタ (デフォルトは vi) でその範囲のコマンドが開く。エディタを閉じると、それらが順番に実行されるよ。

shell を閉じるとき、履歴はホームディレクトリの .bash_history に保存される。デフォルトは1000件まで。

履歴を残したくないときは、普通にログアウトせずに kill -9 PID で shell を強制終了させると、保存をスキップできる裏技があるよ。

HISTFILE=/dev/null にしたり HISTSIZE を空にしても、正常終了すると保存されちゃうことがあるから、強制終了が確実だね。

3.5 コマンドの連結と拡張

shell の本当の強さは、コマンドの入出力を他のコマンドやファイルに繋げられることにあるんだ。

コマンドを繋ぐには「メタ文字 (metacharacter) 」を使う。これは shell にとって特別な意味を持つ記号のこと。

よく使うメタ文字:パイプ | 、アンパサンド & 、セミコロン ; 、括弧 () 、不等号 < > など。

3.5.1 コマンド間のパイプ

パイプ | は、前のコマンドの出力を次のコマンドの入力に渡すよ。

1
cat /etc/passwd | sort | less

これは passwd ファイルの中身を出し、それを並び替えて (sort) 、最後にスクロール表示 (less) する、という流れ。

3.5.2 連続実行

セミコロン ; を使えば、1行で複数のコマンドを順番に実行できるよ。

1
date ; troff -me VertLargeDocument | lpr ; date

大きな文書を処理する前後に date を置いて、どれくらい時間がかかったか測る、なんて使い方ができるね。

3.5.3 バックグラウンド実行

時間がかかる処理は、後ろに & を付けてバックグラウンドで動かそう。

1
troff -me VertLargeDocument | lpr &

処理が終わる前に shell を閉じたりプロセスを殺したりすると、途中で止まっちゃうから気をつけて。

3.5.4 コマンド置換

あるコマンドの実行結果を、別のコマンドの引数として使うことができるんだ。

形式は $(command) または `command` (バッククォート) 。

1
vi $(find /home | grep xyzzy)

これは、まず /home から xyzzy という名前を含むファイルを全部探し出して、その結果を vi コマンドに渡して開く、という動作になる。

注意:ルートディレクトリ / から grep したりすると、数千個のファイルを一気に開こうとして大変なことになるから気をつけてね。

3.5.5 算術式の拡張

計算結果をコマンドに渡したいときは、$[expression] や $((expression)) を使うよ。

1
echo "I am $[2022-1957] years old"

出力は I am 65 years old になる。

1
echo "There are $(ls | wc -w) files in this directory"

今のディレクトリのファイル数を数えて、それをメッセージに組み込んで表示する例だね。

3.5.6 変数の拡張

ドル記号 $ を使って変数の値を呼び出す。

1
ls -l $BASH

これは bash コマンドの実行ファイルの詳細情報を表示するよ。

3.6 shell 変数を使う

shell は変数を使って、ユーザーのセッションに役立つ情報を保存しているんだ。set コマンドを使えば、今設定されているすべての変数が見られるよ。

その中でも、別の shell にも引き継がれる変数を「環境変数」と呼ぶ。これは env コマンドで確認できる。

変数の値を参照するときは、頭に $ を付けるのを忘れずに。

shell 起動時に自動で設定される主な変数をまとめてみたよ。

変数説明
BASHBash コマンドのフルパス。だいたいは /bin/bash
BASH_VERSIONBash のバージョン番号
EUID現在のユーザーの有効なユーザーID
FCEDITfc コマンドで使うエディタ。デフォルトは vi
HISTFILE履歴ファイルの場所。通常は $HOME/.bash_history
HISTFILESIZE保存する履歴の最大件数。デフォルトは 1000
HISTCMD履歴リストの中での今のコマンド番号
HOMEホームディレクトリ
HOSTTYPEシステムのアーキテクチャ (x86_64 など)
MAILメールボックスの場所
OLDPWD1つ前にいたディレクトリ
OSTYPEオペレーティングシステムの種類 (Linux など)
PATHコマンドを探すディレクトリのリスト (コロン : 区切り)
PPID親プロセスのID
PROMPT_COMMANDプロンプトを表示する直前に実行されるコマンド
PS1メインのプロンプトのデザイン
PWD今いるディレクトリ (カレントディレクトリ)
RANDOM0〜32767 の乱数を生成する
SECONDSshell を起動してからの経過秒数
SHLVLshell の深さレベル。su や bash を叩くたびに増える
TMOUT無操作時に自動ログアウトするまでの秒数

3.6.1 エイリアスの作成と利用

alias コマンドを使えば、長いコマンドに短いニックネームを付けられるよ。

1
alias p='pwd ; ls -CF'

これで p と打つだけで、今の場所を表示してからファイル一覧をカラム表示してくれるようになる。

消したいときは unalias を使えばOK。

3.6.2 shell を終了する

exit と打つか、Ctrl+D を押せば終了できるよ。

3.7 自分好みの shell 環境を作る

設定をいじって、もっと効率よく作業できるようにしよう。

3.7.1 shell を設定する

Bash の挙動はいくつかの設定ファイルで決まっているんだ。

ファイル説明
/etc/profile全ユーザー共通の設定。ログイン時に一度だけ読み込まれる。パスの設定などもここ。
/etc/bashrcBash を開くたびに読み込まれる全ユーザー共通設定。プロンプトやエイリアスのデフォルトなど。
~/.bash_profileユーザー個別のログイン時設定。環境変数を追加するならここがおすすめ。
~/.bashrcユーザー個別の Bash 起動時設定。エイリアスを書くのに最適。
~/.bash_logoutログアウト時に実行される。デフォルトでは画面を消去したりする。

/etc/ 以下のファイルをいじるには root 権限が必要だよ。システム全体の設定を変えたいときは、元のファイルを直接いじるより /etc/profile.d/custom.sh みたいなファイルを作って追加するのがお作法。

  • nano エディタ

初心者にも使いやすいエディタだよ。Ctrl+O で保存、Ctrl+X で終了。

3.7.2 プロンプトの設定

プロンプト (入力待ちの記号) は PS1 という変数でカスタマイズできる。

特殊文字説明
\!履歴番号を表示
\#今のセッションでのコマンド番号
\$一般ユーザーなら $ 、root なら # を表示
\W今いるディレクトリ名だけを表示
\[表示されない文字の開始 (色付けとかに使う)
\]表示されない文字の終了
\\バックスラッシュを表示
\d日付を表示
\hホスト名を表示
\n改行
\sshell の名前を表示
\t現在時刻 (HH:MM:SS)
\uユーザー名を表示
\w今いる場所のフルパスを表示

一時的に変えるだけなら export PS1="[\t\w]\$" みたいに打てばいいし、ずっとその設定にしたいなら ~/.bashrc に書き込もう。

詳しく知りたいなら:Bash Prompt HOWTO

3.7.3 環境変数を追加する

よく .bashrc に追加される設定例を紹介するね。

  • TMOUT — 自動タイムアウトの設定。

  • PATH — コマンドを探す場所の追加。例えば ~/bin を追加したいなら:

    PATH=$PATH:~/bin ; export PATH

    今のパス ($PATH) の後ろに ~/bin をくっつけて、それを新しい PATH としてエクスポートしているよ。

セキュリティのリスクがあるから、カレントディレクトリを表す . を PATH に入れるのはやめておこうね。

  • 独自変数 — 自分の作業用ショートカットも作れる。

    MYWORKDIR=/home/yexca/work ; export MYWORKDIR

    こうしておけば、cd $MYWORKDIR で一発で作業ディレクトリに飛べるよ。

3.8 コマンドの情報を調べる

shell に組み込まれたコマンドなら、help コマンドが使える。help | less で一覧を見たり、help cd みたいに特定のコマンドの使い方を見たりできるよ。

多くのコマンドは --help や -h オプションを付けて叩くと、簡単なヘルプを出してくれる。

もっと詳しく知りたいなら info や man コマンドを使おう。


「マニュアルページ (man page) 」は、Linux で一番よく使われる調べ方だよ。

man には 8 つのセクション (章) があるんだ。

章番号章の名前説明
1ユーザーコマンド一般ユーザーが実行できるコマンド
2システムコールプログラムからカーネルを呼び出す関数
3C ライブラリ関数プログラミング用のライブラリ関数
4デバイスと特殊ファイルデバイス関連のファイルなど
5ファイル形式と慣習設定ファイルの書き方とか
6ゲームシステムに入っているゲーム
7その他プロトコルやファイルシステムの概説
8システム管理ツールroot 権限が必要な管理用コマンド

man -k キーワード で、マニュアルのデータベースを検索できるよ。もし検索に失敗するなら、root で mandb を実行してデータベースを作ってね。

特定のセクションを見たいときは、man 5 passwd みたいに番号を指定するんだ。

操作は Page Down / Page Up でページめくり、Enter や矢印キーで1行移動。/ を押してから文字を打つと検索できて、n で次を検索、N で前を検索できるよ。終わるときは q を押せばいいよ。