第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 ウィンドウ
- Terminal ウィンドウを使う
GUI 上でターミナルエミュレータ (Terminal ウィンドウとも呼ばれる) を実行することで、shell を起動できるよ。
だいたいのシステムは Ctrl+Shift+T のショートカットで開けるし、Fedora ならプログラム一覧から探すか、Alt+F2 を押した後に gnome-terminal と入力すればOK。
- 仮想コンソールを使う
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文字オプションならスペースを空けて、単語オプションならイコール = で繋ぐことが多いかな。
例えば:
| |
これは、「/home/yexca ディレクトリの全ファイルを backup.tar というファイル名で作成 (c) し (f) 、作成が終わったら詳細を表示 (v) する」という意味。backup.tar は f オプションの引数だから、f の直後に書く必要があるんだ。
| |
--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 がコマンドを探す順番はこんな感じ:
- エイリアス (Alias):
aliasコマンドで設定された別名。 - shell 予約語:shell が特別な用途で予約している単語。
- 関数:今の shell 内でまとめて実行されるコマンド群。
- 組み込みコマンド (Built-in):cd、echo、exit、pwd、history、fg、set、type など、ファイルシステム上には存在しない shell 内部のコマンド。
- ファイルシステムコマンド:PATH 変数で指定されたディレクトリに保存されている実行ファイル。
コマンドがどこから来ているか知るには、type や which を使う。type -a を使えば、そのコマンドの候補を全部出してくれるよ。
もしコマンドが PATH 内に見つからないときは、locate コマンドで探してみるのも手だね。システム全体からファイルを探してくれるよ。
最近追加したばかりのファイルが見つからないときは、root ユーザーで updatedb を実行してデータベースを更新してみて。
3.4 使用命令历史记录重复执行命令
長くて複雑な、打ち間違えそうなコマンドを何度も打つのは面倒だよね。履歴を使えば楽ができるよ。
3.4.1 コマンドライン編集
デフォルトでは、Bash shell は Emacs ベースのエディタ操作が使えるようになっている。vi のほうが好きなら、ホームディレクトリの .bashrc に set -o vi を書き込めばいいよ。
- コマンドライン移動のショートカット
| キー | 名称 | 意味 |
|---|---|---|
| Ctrl+F | 1文字進む | カーソルを右に移動 |
| Ctrl+B | 1文字戻る | カーソルを左に移動 |
| Alt+F | 1単語進む | カーソルを次の単語へ移動 |
| Alt+B | 1単語戻る | カーソルを前の単語へ移動 |
| Ctrl+A | 行頭へ | コマンドラインの先頭に移動 |
| Ctrl+E | 行末へ | コマンドラインの末尾に移動 |
| Ctrl+L | 画面クリア | 画面を綺麗にして、カーソルを一番上へ |
- コマンドライン編集のショートカット
| キー | 名称 | 意味 |
|---|---|---|
| Ctrl+D | 1文字削除 | カーソル位置の文字を消す |
| 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 コマンド間のパイプ
パイプ | は、前のコマンドの出力を次のコマンドの入力に渡すよ。
| |
これは passwd ファイルの中身を出し、それを並び替えて (sort) 、最後にスクロール表示 (less) する、という流れ。
3.5.2 連続実行
セミコロン ; を使えば、1行で複数のコマンドを順番に実行できるよ。
| |
大きな文書を処理する前後に date を置いて、どれくらい時間がかかったか測る、なんて使い方ができるね。
3.5.3 バックグラウンド実行
時間がかかる処理は、後ろに & を付けてバックグラウンドで動かそう。
| |
処理が終わる前に shell を閉じたりプロセスを殺したりすると、途中で止まっちゃうから気をつけて。
3.5.4 コマンド置換
あるコマンドの実行結果を、別のコマンドの引数として使うことができるんだ。
形式は $(command) または `command` (バッククォート) 。
| |
これは、まず /home から xyzzy という名前を含むファイルを全部探し出して、その結果を vi コマンドに渡して開く、という動作になる。
注意:ルートディレクトリ / から grep したりすると、数千個のファイルを一気に開こうとして大変なことになるから気をつけてね。
3.5.5 算術式の拡張
計算結果をコマンドに渡したいときは、$[expression] や $((expression)) を使うよ。
| |
出力は I am 65 years old になる。
| |
今のディレクトリのファイル数を数えて、それをメッセージに組み込んで表示する例だね。
3.5.6 変数の拡張
ドル記号 $ を使って変数の値を呼び出す。
| |
これは bash コマンドの実行ファイルの詳細情報を表示するよ。
3.6 shell 変数を使う
shell は変数を使って、ユーザーのセッションに役立つ情報を保存しているんだ。set コマンドを使えば、今設定されているすべての変数が見られるよ。
その中でも、別の shell にも引き継がれる変数を「環境変数」と呼ぶ。これは env コマンドで確認できる。
変数の値を参照するときは、頭に $ を付けるのを忘れずに。
shell 起動時に自動で設定される主な変数をまとめてみたよ。
| 変数 | 説明 |
|---|---|
| BASH | Bash コマンドのフルパス。だいたいは /bin/bash |
| BASH_VERSION | Bash のバージョン番号 |
| EUID | 現在のユーザーの有効なユーザーID |
| FCEDIT | fc コマンドで使うエディタ。デフォルトは vi |
| HISTFILE | 履歴ファイルの場所。通常は $HOME/.bash_history |
| HISTFILESIZE | 保存する履歴の最大件数。デフォルトは 1000 |
| HISTCMD | 履歴リストの中での今のコマンド番号 |
| HOME | ホームディレクトリ |
| HOSTTYPE | システムのアーキテクチャ (x86_64 など) |
| メールボックスの場所 | |
| OLDPWD | 1つ前にいたディレクトリ |
| OSTYPE | オペレーティングシステムの種類 (Linux など) |
| PATH | コマンドを探すディレクトリのリスト (コロン : 区切り) |
| PPID | 親プロセスのID |
| PROMPT_COMMAND | プロンプトを表示する直前に実行されるコマンド |
| PS1 | メインのプロンプトのデザイン |
| PWD | 今いるディレクトリ (カレントディレクトリ) |
| RANDOM | 0〜32767 の乱数を生成する |
| SECONDS | shell を起動してからの経過秒数 |
| SHLVL | shell の深さレベル。su や bash を叩くたびに増える |
| TMOUT | 無操作時に自動ログアウトするまでの秒数 |
3.6.1 エイリアスの作成と利用
alias コマンドを使えば、長いコマンドに短いニックネームを付けられるよ。
| |
これで p と打つだけで、今の場所を表示してからファイル一覧をカラム表示してくれるようになる。
消したいときは unalias を使えばOK。
3.6.2 shell を終了する
exit と打つか、Ctrl+D を押せば終了できるよ。
3.7 自分好みの shell 環境を作る
設定をいじって、もっと効率よく作業できるようにしよう。
3.7.1 shell を設定する
Bash の挙動はいくつかの設定ファイルで決まっているんだ。
| ファイル | 説明 |
|---|---|
| /etc/profile | 全ユーザー共通の設定。ログイン時に一度だけ読み込まれる。パスの設定などもここ。 |
| /etc/bashrc | Bash を開くたびに読み込まれる全ユーザー共通設定。プロンプトやエイリアスのデフォルトなど。 |
| ~/.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 | 改行 |
| \s | shell の名前を表示 |
| \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 | システムコール | プログラムからカーネルを呼び出す関数 |
| 3 | C ライブラリ関数 | プログラミング用のライブラリ関数 |
| 4 | デバイスと特殊ファイル | デバイス関連のファイルなど |
| 5 | ファイル形式と慣習 | 設定ファイルの書き方とか |
| 6 | ゲーム | システムに入っているゲーム |
| 7 | その他 | プロトコルやファイルシステムの概説 |
| 8 | システム管理ツール | root 権限が必要な管理用コマンド |
man -k キーワード で、マニュアルのデータベースを検索できるよ。もし検索に失敗するなら、root で mandb を実行してデータベースを作ってね。
特定のセクションを見たいときは、man 5 passwd みたいに番号を指定するんだ。
操作は Page Down / Page Up でページめくり、Enter や矢印キーで1行移動。/ を押してから文字を打つと検索できて、n で次を検索、N で前を検索できるよ。終わるときは q を押せばいいよ。