概要
paiza.ioでrustやってみた。
shell見つけたので、やってみた。
参考にしたページ
サンプルコード
use std::{
env,
io::{stdin, stdout, Write},
path::Path,
process::{Child, Command, Stdio},
};
fn main() {
loop {
print!("> ");
stdout().flush().unwrap();
let mut input = String::new();
stdin().read_line(&mut input).unwrap();
let mut commands = input.trim().split("|").peekable();
let mut previous_command = None;
while let Some(command) = commands.next()
{
let mut parts = command.trim().split_whitespace();
let command = parts.next().unwrap();
let args = parts;
match command {
"cd" => {
let new_dir = args.peekable().peek().map_or("/", |x| *x);
let root = Path::new(new_dir);
if let Err(e) = env::set_current_dir(&root) {
eprintln!("{}", e);
}
previous_command = None;
}
"exit" => return,
command => {
let stdin = previous_command.map_or(Stdio::inherit(), |output: Child| {
Stdio::from(output.stdout.unwrap())
});
let stdout = if commands.peek().is_some()
{
Stdio::piped()
}
else
{
Stdio::inherit()
};
let output = Command::new(command)
.args(args)
.stdin(stdin)
.stdout(stdout)
.spawn();
match output {
Ok(output) => {
previous_command = Some(output);
}
Err(e) => {
previous_command = None;
eprintln!("{}", e);
}
};
}
}
}
if let Some(mut final_command) = previous_command
{
final_command.wait().unwrap();
}
}
}
投入したソース
ls
pwd
exit
実行結果
> build_command
build_exit_code.txt
build_stderr.txt
build_stdout.txt
build_time.txt
exec_command
exec_stderr.txt
exec_stdin.txt
exec_stdout.txt
Main
Main.rs
main.tar.gz
runner_mysql
run_user
> /workspace
>
成果物
以上。