Linuxの基本構造と
Bashでの扱い方
渡邉 浩平Maker Faire Tokyo 2016
1
2017年12月4日(月)
Linux使ってますか
Windows,
88.88%
macOS, 6.29%
Linux, 4.83% FreeBSD,
0.01%
2017年9月のデスクトップOSのシェア
引用元: https://news.mynavi.jp/article/20171002-a160/ Net Applications による報告
もはや無視できない存在(?)
2
基本構造
✓プロセス
✓ファイルシステム
✓ストリーム
3
プロセス
4
【プロセス】 プロセスとは
付帯情報+コマンド
フラグ
制御端末 開始時刻
付帯情報
コマンド
コマンド
状態関数名物理メモリ仮想メモリ
nice値
優先度PPIDPIDUID
5
【プロセス】 プロセスの一生
親プロセス
実行中
TASK_RUNNING
ゾンビ
EXIT_ZOMBIE
死
EXIT_DEAD
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE
TASK_KILLABLE
TASK_DEAD
TASK_STOPPED
TASK_TRACED
TASK_WAKING
...
fork()
exit()
wait()
実は前途多難
6
【プロセス】 Bashの基本書式
Simple Commands (コマンド)
• Delimiters: space や tab
• Words: 0-9A-Za-z+-=:%#@^_{} …
Pipelines
• command | input-command
Lists
• || && & ; newline
Compound Commands
• (lists) や { lists;}
Shell Function Definitions
• func_name() compound-commands
コマンドは文字列
7
ファイルシステム
8
【ファイルシステム】 ファイルとは
パーミッション
ファイルの種類
オーナー グループ
ハードリンク数
サイズ 更新時刻 名前
付帯情報 名前
付帯情報+名前+データ
9
【ファイルシステム】 特殊なファイル
シンボリックリンク
• ln -s file link_name
デバイスファイル
• /dev/null など
名前付きパイプ
• mkfifo name
UNIXドメインソケット
いろいろな種類のファイルが存在
10
【ファイルシステム】 パターンマッチ
*
• 任意の1…n文字のファイル名にマッチする
?
• 任意の1文字にマッチする
[…]
• []の中の1文字にマッチする
ただし / にはマッチしない
ただし先頭の . はマッチしない
パターンマッチを駆使してファイル名に展開
11
【ファイルシステム】 shopt
shopt -s globstar
**
• / にもマッチする
さらに強力なパターンマッチも利用可能
shopt -s extglob
?(pattern|pattern…)
*(pattern|pattern…)
+(pattern|pattern…)
@(pattern|pattern…)
!(pattern|pattern…)
12
ストリーム
13
【ストリーム】 ストリームとは
プロセスとファイルを仲介する媒体
14
【ストリーム】 標準入出力
標準入出力を介してファイルを扱う
標準入力
<file
cat file
<<word や <<-word
次に出てくる word まで
標準入力ストリームに流す
<<<word (Bash3+)
command <<<word や
<<<word command は
echo word | command
標準出力
>file
tee file >/dev/null
>>file
tee -a file >/dev/null
read var
1行を読み込み var に代入
15
【ストリーム】 パイプ
プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 – Qiita
http://qiita.com/piroor/items/77233173707a0baa6360
パイプ「|」で標準入出力を自在に操る
16
発表は以上です
詳細は man bash ↵
17
【小ネタ】 地味に便利なCtrlキー
• ^C 中断 (kill -SIGINT pid)
• ^D ログアウト (logout)
• ^R ヒストリーのインクリメント検索
• ^H / ^D バックスペース/デリート
• ^W スペース・タブ直後までバックスペース
• ^A 先頭まで移動
• ^E 末尾まで移動
• ^U 先頭まで削除
• ^K 末尾まで削除
• ^B (backward) ^N (next) ^P (previous) ^F (forward) :
移動 viのhjklに相当
• ^V 制御文字を直接入力
18
【問題】 連番を出力
解答例
seq 10
ruby -e 'p *(1..10)'
echo {1..10} | xargs –n1
(あるいは | tr ' ' '⧵n')
(あるいは | sed 's/ /⧵n/g')
for i in {1..10}; do echo $i; done
for((i=1;i<=10;i++)); do echo $i; done
出力例
1
2
3
…
9
10
19
【問題】 連番を出力
解答例
seq 10
ruby -e 'p *(1..10)'
echo {1..10} | xargs –n1
(あるいは | tr ' ' '¥n')
(あるいは | sed 's/ /¥n/g')
for i in {1..10}; do echo $i; done
for((i=1;i<=10;i++)); do echo $i; done
20
【問題】 連番のファイルを生成
解答例
touch {01..10}
seq –w 10 | xargs touch
printf ' %02d' `seq 10` | xargs touch
for((i=1;i<=10;i++)); do
f=0$i
>>${f:$((${#i}-1)):2}
done
21
期待結果
$ ls
01 03 05 07 09
02 04 06 08 10
【問題】 連番のファイルを生成
解答例
touch {01..10}
seq –w 10 | xargs touch
seq –f %02g 10 | xargs touch
printf ' %02d' `seq 10` | xargs touch
for((i=1;i<=10;i++)); do
f=0$i
>>${f:$((${#i}-1)):2}
done
22
【問題】 大きいサイズのファイル生成
解答例
head -c $((10**6)) /dev/zero >file
期待結果
$ ls -l
-rw-rw-rw- 1 root root 1000000 11月 29 14:00 file
$ cat file
# やや重いが何も表示されない
23
【問題】 大きいサイズのファイル生成
解答例
fallocate -l 1MB file
head -c $((10**6)) /dev/zero >file
dd if=/dev/zero of=file bs=1000 count=1000
24
【問題】 ファイルの最後の行を削除
解答例
sed –i'' '$d' file
cat file | (rm -f file && head -n -1 >file)
期待結果
$ cat file
1
2
3
$ # ファイルの最後の行を削除
$ cat file
1
2
$
25
【問題】 ファイルの最後の行を削除
解答例
sed –i'' '$d' file
cat file | (rm -f file && head -n -1 >file)
26

2017-12-04 Linuxの基本構造とBashでの扱い方