狠狠撸

狠狠撸Share a Scribd company logo
Unix 基礎
最終更新日: Feb. 27, 2014
<akagisho@gmail.com>
本スライドについて
? 目的:
– Unix の概念や、一般ユーザとして利用するうえで最低
限身につけておくべき知識について解説する
– 各コマンドの網羅的な紹介はしない

? 対象者:
– Unix / Linux 初心者

2
本スライド中の各表記について
? プロンプト
– root で実行するコマンドのプロンプトは # で示す
# command

– 一般ユーザの場合は $ で示す
$ command

? 省略可能な引数は [] で囲う
$ command arg1 [arg2]

3
本スライドの注意点
? 紹介する方法がすべての環境で通用するとは限
らない
– OS やシェルによっては使用できない場合がある

4
UNIX OS

5
OS (Operating System)
? ハードウェアとソフトウェアのやりとりを管理する
アプリケーション
– メモリ、CPU、入出力

? 例:
– BSD, Linux, Windows, Mac OS X, Android, etc.

6
Unix
? OS の一つ
? 1969年、AT&T (アメリカの最大手の電話会社) の
ベル研究所で開発を開始
? マルチタスク
– 複数のプログラムがあたかも同時に動いているかの
ように見える

? マルチユーザ
– 1台のコンピュータを複数のユーザが利用できる

7
ディストリビューション
? OS が流通する形態
? OS = カーネル + ソフトウェア
? BSD
– FreeBSD, OpenBSD, NetBSD, …

? Linux
– Ubuntu, Redhat, CentOS, …

8
スーパーユーザと一般ユーザ
? スーパーユーザ (root)
– システムの管理者

? 一般ユーザ
– root 以外のユーザ

9
グループ
? ユーザの集合
? 全てのユーザは、
– 1つのプライマリグループに必ず所属する
– 0以上のセカンダリグループに所属できる

? 所属するグループは、id コマンドで確認できる
id [user]

10
マニュアル

11
マニュアル
? UNIX には膨大なマニュアルが用意されている
第1章
第2章
第3章
第4章

ライブラリ関数
デバイスとドライバ

第5章
第6章
第7章

ファイル形式
ゲーム
その他

第8章

システム管理コマンド

第9章
12

汎用コマンド
システムコール

カーネル
マニュアル
? man で表示
man [section] name

– 例:
$ man man
man(1)

man(1)

NAME
man - format and display the on-line manual pages
SYNOPSIS
man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]
[-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list]
[section] name ...

13
カーネルとシェル

14
カーネル
? UNIX OS の核となるプログラム
? アプリケーションのための機能を提供する
– プロセス間通信、システムコールなど
アプリケーション

OS

カーネル

CPU

15

メモリ

デバイス
シェル
? カーネルとユーザとの橋渡しをするアプリケーショ
ン
– ユーザと対話し、入力を解釈してカーネルに渡し、コマ
ンドを実行する

? 2つの機能:
– ユーザインタフェース機能
– シェルプログラミング機能

16
いろいろなシェル
sh

どの UNIX にも必ず入っている。対話機能は弱い。

(Bourne シェル)

bash

sh の機能を強化したもの。ヒストリ機能など。
Linux の標準シェル。

csh

BSD 用に開発されたシェル。プログラミング機能
が C 言語に似ている。

tcsh

csh の機能を強化したもの。コマンド補完機能など。

zsh

新しく登場したシェル。様々な独自機能が追加さ
れている。

17
シェルの環境設定
? ログインシェルの設定ファイル
– ログイン時に次の順序で設定ファイルが実行される
(Bourne シェルの場合)
1. /etc/profile
2. ~/.profile

? 一時的なシェルの設定ファイル
– 一時的にシェルを起動 (コマンドラインで sh と実行) し
たときは、次のファイルが実行される
? ~/.shrc

? これらのファイルに設定を書けば良い
18
シェルの変更
? ログインシェルの変更
– chsh コマンドを使う
chsh –s newshell [user]

? 一時的にシェルを変更
– シェル名をコマンドとして実行する
? 例:
$ bash

19
シェルスクリプト
? UNIX コマンドを羅列したスクリプト
– バッチ処理などで使われる

? ファイル1行目の #! からはじまる記述をシェバン
(shebang) という
– スクリプトを読み込むインタプリタを指定する
– 例:
#!/bin/sh

20
環境変数
? システムの属性を格納している変数
? 例:
PWD
TERM
HOME

カレントディレクトリ
端末の種類
ホームディレクトリ

LANG
PATH

言語設定
コマンドサーチパス

SHELL

使用中のシェル

? 値を取得するときは先頭に $ を付ける
21
コマンドサーチパス ($PATH)
? シェルがコマンドを探索するディレクトリのリスト
– コロン (:) 区切りで記述
– 例:
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/lo
cal/sbin:/usr/local/bin:/home/sho/bin

– これらのディレクトリ内にあるプログラムなら、絶対パ
スで指定しなくても、プログラム名だけで実行できる

22
POSIX (Portable Operating System Interface)
? UNIX の標準的なインターフェースを定めた規格
– 移植性の高いソフトウェアの開発を目的として、IEEE
が策定した
– 各 OS やシェルの独自拡張により、スクリプトなどを別
環境に移動すると動作しないことがある
– 各環境間での最低限の互換性を確保する
– 内容は多岐に渡る
? システムコール、標準ライブラリ、OS コマンド、正規表現な
ど

23
端末

24
端末 (Terminal)
? キーボードとディスプレイが1セットになった装置
– かつては、1台のホストコンピュータに端末を接続して
共用するのが主流だった
Terminal

Host Computer

Keyboard

Keyboard
Display

Terminal

Terminal

Program
Program

Display

Terminal

Keyboard
Display

25

Keyboard
Display
端末 (Terminal)
? 端末エミュレータ
– 端末をエミューレートするソフトウェア
– エミュレートされた端末を仮想端末という
? telnet や SSH もその一種
Server
Terminal
Emulator

Client

Virtual
Terminal
Keyboard
Display

26
端末 (Terminal)
? 現在使用している端末名を確認するには tty コマ
ンドを使う
tty

? すべての端末を表示するには w コマンドを使う
w

27
ファイルとディレクトリ

28
ファイルシステム
? OS の機能の一つ
? 主に補助記憶装置 (HDD など) に格納されたデー
タを管理する

29
ファイル
? データを格納するための論理的な単位
? 1人のユーザに所有され、1つのグループに属す
る
– そのグループに、所有者が必ずしも属しているとは限
らない

30
ディレクトリ
? ファイルを整理、管理するための木構造
? 木の根をルートディレクトリと言う
? 特別な意味を持つ記号:
– 階層はスラッシュ (/) で区切って表記する
– 先頭のスラッシュはルートディレクトリを表す
– 先頭のチルダ (~) はホームディレクトリを表す
– ドット (.) のみはカレントディレクトリを表す
– 2つのドット (..) のみは1つ上のディレクトリを表す

31
ディレクトリ
? mv, cp には注意
– source, target 名末尾のスラッシュ (/) の有無で動作が
変わる場合がある
cp –R source/ target/
mv source/ target/

? ディレクトリ自体か、中身だけか

– target ディレクトリが存在するか否かでも動作が変わ
る

32
inode (あいのーど)
? ファイルシステムで使われているデータ構造

? ファイル、ディレクトリなどのオブジェクトに関する
各種情報が格納される
?
?
?
?
?
?

33

inode 番号
? 各種タイムスタンプ
ファイルの長さ
? 更新時刻 (mtime)
デバイス ID
? 属性変更時刻 (ctime)
所有者のユーザ ID
? 参照時刻 (atime)
グループ ID
? 参照カウント (その inode を
パーミッション
指すハードリンクの数)
inode とファイル名
? ディレクトリには以下の情報のみを格納
1. そのディレクトリにあるファイルのリスト
2. 対応する inode 番号
inode 番号

ディレクトリ
File_A.txt
File_A.txt
File_A.txt
inode 番号
inode 番号
inode 番号

inode 番号
inode 番号

ファイル
ファイル
実体
実体

ファイル
実体

? inode 番号は ls の –i オプションで確認できる
34
リンク
? ファイルやディレクトリに別名を付けること
ln [–s] source_file target_file

– 例:
$ touch hoge
$ ln –s hoge fuga
$ ls -l | tail +2
lrwxr-xr-x 1 sho
-rw-r--r-- 1 sho

35

staff
staff

4 12 20 15:41 fuga -> hoge
0 12 20 15:41 hoge
シンボリックリンクとハードリンク
? シンボリックリンク
– ファイル名へのポインタ

? ハードリンク
– inode 番号へのポインタ
File_A.txt

inode 番号

File_B.txt

36

inode 番号

ファイル
実体

File_A.txt

inode 番号

File_B.txt

inode 番号

inode 番号

ファイル
実体
パーミッション

37
パーミッション (属性)
? ファイル、ディレクトリごとに定義されるアクセス許
可情報
? 所有者 (User)、グループのメンバ (Group)、その
他のユーザ (Other) ごとに権限を設定する
– o は other。owner ではないので注意。

(Read)

読出し権

w (Write)

書込み権

x

実行権

r

38

(eXecute)
パーミッション (属性)
? 各権限ごとに 1bit、計 9bit で表す
r

w

x

所有者 (u)

r

w

x

グループ (g)

r

w

x

その他 (o)

? 3bit ごとに区切り、8進数で表現されることがある
– 例) rw-r--r-- = 110 100 100 = 644
? 所有者は読み書きができる
? グループのメンバは読み込みができる
? その他のユーザは読み込みができる

39
パーミッションの変更
? chmod を使う
chmod mode file

– 例:
$
$
$
$
$

chmod
chmod
chmod
chmod
chmod

g+w
go-rwx
+x
o=r
755

file1
file1
file1
file1
file1

#
#
#
#
#

? 上3つは相対的な指定
? 下2つは絶対的な指定

40

group に書込み権を付与
group と other の全権限を解除
全ユーザに実行権を付与
other の権限を r-- に変更
755 (rwxr-xr-x) に変更
ディレクトリのパーミッション
? ファイルのパーミッションとは意味が異なる
r
w

(Read)
(Write)

x

(eXecute)

ディレクトリ内のファイルリストを表示できる。
ディレクトリ内で
?ファイル、サブディレクトリの新規作成
?ファイル、サブディレクトリの削除
ができる。
cd でそのディレクトリに移動できる。

– 変更方法は同じく chmod

41
SUID (Set User ID) bit
? この bit がセットされた実行ファイルは、(実行者で
はなく) 所有者の権限で動作する
? 一般ユーザが root 権限でプログラムを実行した
りできる
– 例:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 30768 Feb 22

? SGID というのもある

42

2012 /usr/bin/passwd
Sticky bit
? この bit がセットされたディレクトリ配下では、ファ
イルやディレクトリの所有者 (と root) だけが、リ
ネームや削除を行える
– 例:
$ ls -ld /tmp
drwxrwxrwt 2 root root 4096 Feb 27 10:05 /tmp

43
コマンドラインの操作

44
コマンド置換
? コマンドの実行結果を別のコマンドの一部として
使える機能
`command`
$(command)

# こっちだと入れ子にできる

– 例:
$ echo "It's" `date +'%Y-%m-%d'`.
It's 2013-12-20.
$ echo "It's" $(date +'%Y-%m-%d').
It's 2013-12-20.

45
入力補完機能
? コマンドやファイル名の入力をシェルが補完 (自
動入力) してくれる機能
– 入力途中で [Tab] キーを押す
– 例:
$ ifc

$ ifconfig

– 複数候補がある場合、リストが表示される
46
ワイルドカード
? 複数のファイル名やディレクトリ名を指定する際
に使う特殊記号 (メタ文字)
*
?
[?]
[!?]
{?,?,…}

47

任意の文字列
任意の1文字
[ ] 内の任意の1文字
[ ] 内にない任意の1文字
{ } 内の任意の文字列
(カンマで区切る)
ワイルドカード
? 例:
$ ls
car

cart

cat

$ ls c*t
cart
cat

court

$ ls c[ao]?
car
cat

com

$ ls c{art,at}
cart
cat

48

com

court

dog
メタ文字の無効化
? 直前にバックスラッシュ (?) を付けてエスケープす
る
– 例:
$ touch hoge?*fuga
$ ls
hoge*fuga

※ 環境によっては円マークに見える場合がある

? シングルクオートで囲う
– 例:
$ touch 'hoge$fuga'
49
シングルクオートとダブルクオート
? スペースなどを含む文字列はクオートで囲う
– ダブルクオートだと、変数やコマンド置換が展開される
$ echo "hoge `date`"
hoge Tue Jan 21 18:21:55 JST 2014

– シングルクオートでは展開されない
$ echo 'hoge `date`'
hoge `date`

50
ヒストリ
? 以前入力したコマンドを参照する機能
? 使用方法:
– カーソルキー (↑, ↓)
– history コマンド
– Ctrl+R <検索するキーワード>
? 例:
$ Ctrl+R
bck-i-search: ping

51
エイリアス
? コマンドに別名を付けられる機能
alias name
alias name='value'

# 現在の設定を表示

– 引数も含められる
– 例:
$ alias ll='ls –l'
$ alias ll
ll='ls -l'
$ ll
(略)

52

# ls –l と等価
エイリアス
? 解除は unalias コマンドを使う
unalias name

? 既にあるコマンドの上書きもできる
? 元のコマンドを実行するには、コマンドの前にバッ
クスラッシュ (?) を付ける
?name

53
標準入力と標準出力、標準エラー出力
? 通常、プログラムは端末 (キーボードとディスプレ
イ) からデータを入出力する
標準入力 (stdin)

キーボードからの入力

標準出力 (stdout)

ディスプレイへの出力

標準エラー出力 (stderr)

ディスプレイへの出力

? リダイレクションを使うと、入出力先をファイルなど
に切り替えられる

54
リダイレクト
コマンド <

ファイル ファイルから標準入力に入力

コマンド >

ファイル 標準出力をファイルに書出し (上書き)

コマンド >>

ファイル 標準出力をファイルに書出し (追記)

コマンド >& ファイル
コマンド >>& ファイル
コマンド 2>

55

標準出力と標準エラー出力をファイル
に書出し (上書き)
〃

(追記)

ファイル 標準エラー出力をファイルに書出し
リダイレクト
? 例:
$ echo Hello > hoge.txt
$ cat hoge.txt
Hello
$ echo World >> hoge.txt
$ cat hoge.txt
Hello
World

$ echo Hello &> /dev/null
$

56

# 書出し
# 追記
/dev/null
? 何もしないデバイス
– 書き込まれたデータは捨てられる
– 読み込むと常に EOF (End Of File) が返される

? ここにリダイレクトすることで出力を破棄できる
– 例:
$ program > /dev/null
$ program 2> /dev/null

$ program &> /dev/null

57
パイプ (|)
? プログラム間で入出力をつなぐ仕組み
– あるプログラムの標準出力を、あるプログラムの標準
入力に接続する
cmd1 | cmd2

– 例:
$ find . -type f | wc -l
6

58
何でもかんでもつながない
? なるべく少ないプロセス数で済ませる
– 例:
× $ cat hoge.txt | grep
○ $ grep fuga hoge.txt
×
○

59

fuga

$ grep fuga hoge.txt | wc -l
$ grep –c hoge.txt fuga
連続実行
? セミコロン (;) で区切ることで、複数のコマンドを連
続実行できる
cmd1 ; cmd2

– 例:
$ echo hello ; date
hello
Fri Dec 20 20:06:52 JST 2013

60
条件付きで連続実行
? cmd1 が正常終了したら cmd2 を実行する
cmd1 && cmd2

? cmd1 が異常終了したら cmd2 を実行する
cmd1 || cmd2

? “正常終了” って?
– コマンドの exit status が 0 だったとき

61
終了ステータス (exit status, return code)
? コマンドの実行が成功したかどうかを表す数値
– 正常終了なら 0
– 異常終了なら 1 以上

? 自分でスクリプトを書くときも意識しよう
–例
if (system("which git") != 0) {
print STDERR "command not found?n";
exit 1;
}

62
終了ステータス (exit status, return code)
? 直前に実行したコマンドの終了ステータスは、特
殊な変数 $? に格納される
– 例:
$ mkdir hoge
$ echo $?
0

# 直前の mkdir は成功

$ mkdir hoge
mkdir: hoge: File exists
$ echo $?
1
# 直前の mkdir は失敗

63
アーカイブと圧縮

64
アーカイブ
? 多数のファイルを一つのファイルにまとめること

? tar (Tape ARchives)
– アーカイブのフォーマット
– 所有者、グループ、パーミッション、最終更新日時、
ディレクトリ構造なども含められる
– 同時に gzip などで圧縮を行なうことが多い

65
圧縮
? データの内容を保ったまま容量を減らすこと
? 可逆圧縮:
– 情報が失われない
– bitmap, ZIP, etc.

? 非可逆圧縮:
– 圧縮、展開したデータが、元のデータと完全には一致
しない
– JPEG, MPEG, etc.

66
ジョブとプロセス

67
ジョブ
? シェルが管理するプログラムの実行単位
– 端末ごとに管理される
– それを実行したシェル以外からは参照できない

? 実行中のジョブは jobs コマンドで確認できる
jobs

68
ジョブの中断と再開
? SIGTSTP シグナル を送る (Ctrl-Z) と、フォアグラウ
ンド (現在実行中) のジョブが中断される
? fg コマンドで再開する
– 例:
$ less hoge
^Z
zsh: suspended less hoge
$ jobs
[1] + suspended less hoge
$ fg

69

# Ctrl-Z を入力
# 中断
# 再開
バックグラウンドジョブ
? 裏で実行されているジョブ (次のジョブを実行可)
? 起動方法:
– コマンドのうしろに & を付けて起動する
command &

– 中断したジョブを bg コマンドで再開する

? ログアウト時には破棄 (SIGHUP) される
– これを防ぐには nohup コマンドを使う
nohup command &

70
プロセス
? プロセス
– OS が管理するプログラムの実行単位
– 実行中のプロセスは ps コマンドで確認できる
ps

– 例:
$ ps
PID
77869
79178

71

TT
0
0

STAT
Ss
R+

TIME COMMAND
0:00.02 bash
0:00.00 ps
ジョブとプロセス
? 1ジョブ = 1プロセスとは限らず、1つのジョブに複
数のプロセスが属する場合がある
– 例:
ジョブ
$ ps auxww | grep root | wc -l

プロセス

72

プロセス

プロセス
ジョブとプロセス
? 1コマンドで複数のプロセスが起動することもある
– 例: man コマンドを中断したときの様子
$ ps
PID
12609
12965
12966
12967
12971
12973

73

TTY
ttys003
ttys003
ttys003
ttys003
ttys003
ttys003

TIME
0:00.21
0:00.00
0:00.00
0:00.00
0:00.00
0:00.00

CMD
/bin/zsh
man man
sh -c (cd '/usr/share/man'…
sh -c (cd '/usr/share/man'…
sh -c (cd '/usr/share/man'…
/usr/bin/less -is
シグナル
? プロセスに非同期イベントの発生を伝える仕組み
? 発生させるには:
– 端末で Ctrl-C (SIGINT)や Ctrl-Z (SIGTSTP) などを押下
– kill コマンドを使用

? 受け取ったシグナルをどう処理するかは、プロセ
ス (プログラム) 側の任意
– ただし SIGKILL など、一部受け取れないものもある

74
その他

75
cron
? コマンドを自動的に定時実行する仕組み
? crontab コマンドで管理する
? 設定ファイルの書式:
分 時 日 月 曜日 実行するコマンド

– 例: 月?金曜、2時間おきに program1 を実行
0 */2 * 1-5 /path/to/program1

76
SSH (Secure SHell)
? 安全に遠隔ホストのシェルを利用する仕組み
? 鍵認証を使えばパスワードの入力を省略できる
– クライアントで鍵のペア (秘密鍵、公開鍵) を生成
? ssh-keygen コマンド

– 公開鍵をホストに配置
? ~/.ssh/authorized_keys

77
練習問題

78
練習問題
1. 現在のユーザ名を表示せよ。
2. man で id コマンドの –g オプションの意味を調べ
よ。
3. コマンドサーチパスの先頭にカレントディレクトリ
(.) を追加すると、どのようなことが起きるか説明
せよ。また、それを設定するとどのような危険が
考えられるか。
4. ルートディレクトリ自身 (中のファイルではなく) の
inode 番号を確認せよ。
79
練習問題
5. 適当なファイルを用意してシンボリックリンクと
ハードリンクを設定し、主に以下の点に着目して、
2つのリンクの違いを検証せよ。
– コピーしたとき
– 削除したとき

6. パーミッション rwx---r-x を8進数で表わせ。
7. group のパーミッションが other より小さいとき
(604 や 705 など) の動作を説明せよ。

80
練習問題
8. 中身が空 (0byte) のファイル empty.txt を作成す
る方法を、できるだけたくさん挙げよ。
9. シェル変数 NOW に現在の時刻を格納せよ。時
刻のフォーマットは次のようにすること。
2013-12-24T12:43:52

10.次の名前で空のファイルを作成せよ。
hoge$fuga

11.ルートディレクトリにあるディレクトリの数を表示
せよ。
81
練習問題
12.以下の記述について、コマンドが成功したときに
"OK!" と表示するように変更せよ。成功時と失敗
時の動作の違いを確認すること。
$ mkdir test1

13.top コマンドを実行して中断し、そのときのジョブ
の状態を確認せよ。また、そのジョブを再開せず
に破棄せよ。

82
練習問題
14.shebang 行の記述に関して、以下の2つの違いを
説明せよ。また、後者はどのような利用シーンが
考えられるか。
#!/usr/bin/perl
#!/usr/bin/env perl

15.適当なファイルを作成し、タイムスタンプを「2013
年12月25日19時00分」に変更せよ。さらにその
ファイルの mtime と ctime を確認せよ。

83
参考書籍
? 新Linux/UNIX入門 第3版, 林 晴比古 著
– http://www.amazon.co.jp/dp/4797369841

84
おわり

85

More Related Content

Unix 基礎