自分なりに適当にやってみたので間違いだらけかも。
前回
解釈してみた
UNIX体系(CLI)はUNIX哲学に根ざして実装されている。UNIX哲学に従えば必然的にUNIX体系にとって良いソフトウェアが開発できる。
- ひとつのコマンドはひとつのことだけをうまくやれ
- コマンドはパイプラインで連携できるよう標準入出力を使え
- コマンドの連携によって成果を最大化せよ
UNIXプログラミング技法は、開発全般に言える一般論と思われる。
- 成果を最大化する
UNIXではコマンドをパイプラインでつなげ連動することで多くの問題を解決する。少ないコマンドを実装し、その組合せ方で多様な問題を解決できる。
6. ソフトウェアを梃子(てこ)として利用せよ。
「小さい労力で最大限の効果を得よ」ということか?
- 成果を最大化せよ
- 自動化せよ
- 労力を最小化せよ
- 一行の呼出を書くだけで数千行のスクリプトを実行せよ
- 労力を最小化せよ
- 自動化せよ
成果はべつに自動化だけとは限らない。充実した時間などプライスレスなものから金銭・権利・立場などを得ることなど。
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
「コマンドは標準入出力された値を変更するものであれ」ということか?
UNIX体系(CLI)はコマンドをパイプラインで連結してデータを変換していくことで目的のデータを得るものである。
- UNIXはパイプラインでデータを入出力する体系である
- フィルタとはデータを変換することである
データは単純であるべき
データは単純な形式であるべき。さもなくばフィルタ処理が複雑になってしまう。必然的に以下の哲学を満たす。
- 単純なテキストファイルにデータを格納せよ。
- プレーンテキスト形式であること
- 単純な構造であること
- データ構造
- 一〜二次元
- DSV
- デリミタ(区切り文字)
- スペース
- 改行
- タブ
- カンマ(
,
)
- デリミタ(区切り文字)
- DSV
- 一〜二次元
- データ構造
JSONやXMLなどは複雑すぎて扱いづらい。バイナリファイルなど論外。
データの次元
人間は三次元で生きているため二次元くらいが限界。一次元だと複雑化しづらい。三次元だと表現しづらい(紙、ディスプレイ等)。
標準入出力はファイルストリームという一次元のバイナリ配列である。デリミタで仮想的に二次元にしているにすぎない。そのせいでファイルストリームから一部を抽出する処理が必要になる。シンプルをめざすなら一次元のリストくらいまでが良いか。
もう少し詳しく
パイプとチェーンの違い
どちらも関数型プログラミング。
方法 | 入力値 | 入力値の保持 |
---|---|---|
パイプライン | 値 | 変化しない(新しい値) |
メソッドチェーン | 参照 | 変化する(参照で使いまわす) |
- https://qiita.com/khiraiwa/items/067f9edeae59fd8e35c0
- http://hamasyou.com/blog/2014/02/21/functional-javascript/
コマンドは動詞である
動詞とは品詞のひとつであり〜をする
という意味の言葉である。
コマンド | 意味 |
---|---|
echo |
オウム返しする |
cd |
カレントディレクトリを変更する |
cp |
ファイルをコピーする |
入出力は標準入出力を使う
入出力 | 正 | 誤 |
---|---|---|
出力 | 標準出力(echo )で出力する |
return , exit は0〜255の数値しか使えない |
入力 | 標準入力(pipe)で受け取る | 引数は動作を細かく変えるオプションに過ぎない |
シェルはパイプを使って連携する
- シェルはパイプを使って連携する
- 変数に値の代入をするよりも
以下のようにパイプで処理するのがUNIX体系(CLI)に合ったやり方。
echo $(echo "\"value\"" | sed -e 's/^\"//' | sed -e 's/\"$//')
複数行にするなら\
で連結する。
echo $(echo "\"value\"" \ | sed -e 's/^\"//' \ | sed -e 's/\"$//' \ )
以下のような書き方はシェルに不相応。
value="\"value\"" value=${value#"} value=${value%"} echo "${value}"