Unix 基礎2. 本スライドについて
• 目的:
– Unix の概念や、一般ユーザとして利用するうえで最低
限身につけておくべき知識について解説する
– 各コマンドの網羅的な紹介はしない
• 対象者:
– Unix / Linux 初心者
2
6. OS (Operating System)
• ハードウェアとソフトウェアのやりとりを管理する
アプリケーション
– メモリ、CPU、入出力
• 例:
– BSD, Linux, Windows, Mac OS X, Android, etc.
6
7. Unix
• OS の一つ
• 1969年、AT&T (アメリカの最大手の電話会社) の
ベル研究所で開発を開始
• マルチタスク
– 複数のプログラムがあたかも同時に動いているかの
ように見える
• マルチユーザ
– 1台のコンピュータを複数のユーザが利用できる
7
13. マニュアル
• 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
15. カーネル
• UNIX OS の核となるプログラム
• アプリケーションのための機能を提供する
– プロセス間通信、システムコールなど
アプリケーション
OS
カーネル
CPU
15
メモリ
デバイス
22. コマンドサーチパス ($PATH)
• シェルがコマンドを探索するディレクトリのリスト
– コロン (:) 区切りで記述
– 例:
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/lo
cal/sbin:/usr/local/bin:/home/sho/bin
– これらのディレクトリ内にあるプログラムなら、絶対パ
スで指定しなくても、プログラム名だけで実行できる
22
23. POSIX (Portable Operating System Interface)
• UNIX の標準的なインターフェースを定めた規格
– 移植性の高いソフトウェアの開発を目的として、IEEE
が策定した
– 各 OS やシェルの独自拡張により、スクリプトなどを別
環境に移動すると動作しないことがある
– 各環境間での最低限の互換性を確保する
– 内容は多岐に渡る
• システムコール、標準ライブラリ、OS コマンド、正規表現な
ど
23
25. 端末 (Terminal)
• キーボードとディスプレイが1セットになった装置
– かつては、1台のホストコンピュータに端末を接続して
共用するのが主流だった
Terminal
Host Computer
Keyboard
Keyboard
Display
Terminal
Terminal
Program
Program
Display
Terminal
Keyboard
Display
25
Keyboard
Display
26. 端末 (Terminal)
• 端末エミュレータ
– 端末をエミューレートするソフトウェア
– エミュレートされた端末を仮想端末という
• telnet や SSH もその一種
Server
Terminal
Emulator
Client
Virtual
Terminal
Keyboard
Display
26
32. ディレクトリ
• mv, cp には注意
– source, target 名末尾のスラッシュ (/) の有無で動作が
変わる場合がある
cp –R source/ target/
mv source/ target/
• ディレクトリ自体か、中身だけか
– target ディレクトリが存在するか否かでも動作が変わ
る
32
33. inode (あいのーど)
• ファイルシステムで使われているデータ構造
• ファイル、ディレクトリなどのオブジェクトに関する
各種情報が格納される
33
inode 番号
各種タイムスタンプ
ファイルの長さ
• 更新時刻 (mtime)
デバイス ID
• 属性変更時刻 (ctime)
所有者のユーザ ID
• 参照時刻 (atime)
グループ ID
参照カウント (その inode を
パーミッション
指すハードリンクの数)
34. inode とファイル名
• ディレクトリには以下の情報のみを格納
1. そのディレクトリにあるファイルのリスト
2. 対応する inode 番号
inode 番号
ディレクトリ
File_A.txt
File_A.txt
File_A.txt
inode 番号
inode 番号
inode 番号
inode 番号
inode 番号
ファイル
ファイル
実体
実体
ファイル
実体
• inode 番号は ls の –i オプションで確認できる
34
35. リンク
• ファイルやディレクトリに別名を付けること
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
39. パーミッション (属性)
• 各権限ごとに 1bit、計 9bit で表す
r
w
x
所有者 (u)
r
w
x
グループ (g)
r
w
x
その他 (o)
• 3bit ごとに区切り、8進数で表現されることがある
– 例) rw-r--r-- = 110 100 100 = 644
• 所有者は読み書きができる
• グループのメンバは読み込みができる
• その他のユーザは読み込みができる
39
40. パーミッションの変更
• 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) に変更
42. 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
43. Sticky bit
• この bit がセットされたディレクトリ配下では、ファ
イルやディレクトリの所有者 (と root) だけが、リ
ネームや削除を行える
– 例:
$ ls -ld /tmp
drwxrwxrwt 2 root root 4096 Feb 27 10:05 /tmp
43
49. メタ文字の無効化
• 直前にバックスラッシュ (¥) を付けてエスケープす
る
– 例:
$ touch hoge¥*fuga
$ ls
hoge*fuga
※ 環境によっては円マークに見える場合がある
• シングルクオートで囲う
– 例:
$ touch 'hoge$fuga'
49
53. エイリアス
• 解除は unalias コマンドを使う
unalias name
• 既にあるコマンドの上書きもできる
• 元のコマンドを実行するには、コマンドの前にバッ
クスラッシュ (¥) を付ける
¥name
53
55. リダイレクト
コマンド <
ファイル ファイルから標準入力に入力
コマンド >
ファイル 標準出力をファイルに書出し (上書き)
コマンド >>
ファイル 標準出力をファイルに書出し (追記)
コマンド >& ファイル
コマンド >>& ファイル
コマンド 2>
55
標準出力と標準エラー出力をファイル
に書出し (上書き)
〃
(追記)
ファイル 標準エラー出力をファイルに書出し
56. リダイレクト
• 例:
$ echo Hello > hoge.txt
$ cat hoge.txt
Hello
$ echo World >> hoge.txt
$ cat hoge.txt
Hello
World
$ echo Hello &> /dev/null
$
56
# 書出し
# 追記
60. 連続実行
• セミコロン (;) で区切ることで、複数のコマンドを連
続実行できる
cmd1 ; cmd2
– 例:
$ echo hello ; date
hello
Fri Dec 20 20:06:52 JST 2013
60
61. 条件付きで連続実行
• cmd1 が正常終了したら cmd2 を実行する
cmd1 && cmd2
• cmd1 が異常終了したら cmd2 を実行する
cmd1 || cmd2
• “正常終了” って?
– コマンドの exit status が 0 だったとき
61
62. 終了ステータス (exit status, return code)
• コマンドの実行が成功したかどうかを表す数値
– 正常終了なら 0
– 異常終了なら 1 以上
• 自分でスクリプトを書くときも意識しよう
–例
if (system("which git") != 0) {
print STDERR "command not found¥n";
exit 1;
}
62
63. 終了ステータス (exit status, return code)
• 直前に実行したコマンドの終了ステータスは、特
殊な変数 $? に格納される
– 例:
$ mkdir hoge
$ echo $?
0
# 直前の mkdir は成功
$ mkdir hoge
mkdir: hoge: File exists
$ echo $?
1
# 直前の mkdir は失敗
63
69. ジョブの中断と再開
• SIGTSTP シグナル を送る (Ctrl-Z) と、フォアグラウ
ンド (現在実行中) のジョブが中断される
• fg コマンドで再開する
– 例:
$ less hoge
^Z
zsh: suspended less hoge
$ jobs
[1] + suspended less hoge
$ fg
69
# Ctrl-Z を入力
# 中断
# 再開
71. プロセス
• プロセス
– OS が管理するプログラムの実行単位
– 実行中のプロセスは ps コマンドで確認できる
ps
– 例:
$ ps
PID
77869
79178
71
TT
0
0
STAT
Ss
R+
TIME COMMAND
0:00.02 bash
0:00.00 ps
72. ジョブとプロセス
• 1ジョブ = 1プロセスとは限らず、1つのジョブに複
数のプロセスが属する場合がある
– 例:
ジョブ
$ ps auxww | grep root | wc -l
プロセス
72
プロセス
プロセス
73. ジョブとプロセス
• 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
77. SSH (Secure SHell)
• 安全に遠隔ホストのシェルを利用する仕組み
• 鍵認証を使えばパスワードの入力を省略できる
– クライアントで鍵のペア (秘密鍵、公開鍵) を生成
• ssh-keygen コマンド
– 公開鍵をホストに配置
• ~/.ssh/authorized_keys
77
79. 練習問題
1. 現在のユーザ名を表示せよ。
2. man で id コマンドの –g オプションの意味を調べ
よ。
3. コマンドサーチパスの先頭にカレントディレクトリ
(.) を追加すると、どのようなことが起きるか説明
せよ。また、それを設定するとどのような危険が
考えられるか。
4. ルートディレクトリ自身 (中のファイルではなく) の
inode 番号を確認せよ。
79
81. 練習問題
8. 中身が空 (0byte) のファイル empty.txt を作成す
る方法を、できるだけたくさん挙げよ。
9. シェル変数 NOW に現在の時刻を格納せよ。時
刻のフォーマットは次のようにすること。
2013-12-24T12:43:52
10.次の名前で空のファイルを作成せよ。
hoge$fuga
11.ルートディレクトリにあるディレクトリの数を表示
せよ。
81