Slide 1

Slide 1 text

Rustで作った 自作コマンド群の話 @garebare521

Slide 2

Slide 2 text

自己紹介 名前:ガレバレ とうとうインターンシップ始めた 授業とインターンシップで死にそうに なってる コーヒーの器具を一式買った

Slide 3

Slide 3 text

このスライドは前座

Slide 4

Slide 4 text

皆さん、自作コマンド 作りたくないですか?

Slide 5

Slide 5 text

作りたいですよね?

Slide 6

Slide 6 text

残念ですがそんなことを思っている間に 私が先に作りました

Slide 7

Slide 7 text

でもフルスクラッチではないので 皆さん頑張って下さい

Slide 8

Slide 8 text

最初に下準備

Slide 9

Slide 9 text

とりあえず、全部に実装するトレイトを定義する pub trait Commands { fn help(&self); fn version(&self); fn name(&self) -> &str; fn run(&self) -> Result<(), String>; }

Slide 10

Slide 10 text

helpとversionのオプションはデフォルトで実装 pub trait Commands { fn print_help(&self, options: &Vec, arg: &str) -> bool { if options.contains(&"--help".to_string()) || options.contains(&"-help".to_string()) || options.contains(&"-h".to_string()) || arg == "help" { self.help(); return true; } false } }

Slide 11

Slide 11 text

parser 毎度同じみのパーサー 一番最初に来たものはコマンド名として処理する ハイフンがついているものはオプションとして処理する 何もついてないのは引数として処理する

Slide 12

Slide 12 text

オプション let options = args.iter().filter(|arg| arg.starts_with(“-”)) .map(|arg| arg.to_string()) .collect(); Rustの場合こんな感じにすれば最初の文字がハイフンで始 まってる文字列が取れる

Slide 13

Slide 13 text

引数 let args = args.iter().filter(|arg| !arg.starts_with(“-”)) .map(|arg| arg.to_string()) .collect(); 条件を反転させるだけ

Slide 14

Slide 14 text

- cat - ls - ps - rm - touch - witch 作ったコマンド

Slide 15

Slide 15 text

ざっくり紹介します

Slide 16

Slide 16 text

cat 単純にRustでファイルを開いて一行ずつ読み込んで表示して る -e 最後に$を入れる -n 行番号をつける -b 空白行を入れずに行番号をつける

Slide 17

Slide 17 text

エンジニアの皆様なら 実装は想像つきますよね????

Slide 18

Slide 18 text

ls std::os::unix::fs::{MetadetaExt, PremisstionsExt}でメタデー タと権限を取得 あとはディレクトリを回して表示してる 存在している権限はライブラリで取得 -a 隠しファイルも表示 -l ディテールの表示 -R 再帰的に表示 -r 逆順で表示

Slide 19

Slide 19 text

ps ライブラリを使ってuidとプロセスを取得 大体ライブラリの例通り実装してオプションにより表示を制限す ればいい -x 端末操作以外の全てのプロセスも表示 -a 他ユーザーのも含めてすべてのプロセスを表示 -l ディテールも表示

Slide 20

Slide 20 text

rm Rustでディレクトリを回して単純に削除してる -r 再帰的にファイルを削除 -i 削除する際に同意を求める

Slide 21

Slide 21 text

touch 実はファイルを生成するコマンドじゃない! ライブラリを使って編集時間を取得して更新もしている metadetaから編集時間などを取得するためまぁまぁ実装する のに疲れた -a 最終アクセスした時間をアップデート -m 最終編集した時間をアップデート -r 指定したファイルのタイムスタンプと同じ日時にする

Slide 22

Slide 22 text

touch とは言えファイルの生成もできるようにした

Slide 23

Slide 23 text

witch 環境変数PATHを全部読み込んで分割して表示してる -a フルパスの表示

Slide 24

Slide 24 text

これで全部!