Rust命令行工具增强库devx-cmd的使用,提升开发效率与自动化脚本编写体验
Rust命令行工具增强库devx-cmd的使用,提升开发效率与自动化脚本编写体验
devx-cmd
为开发脚本提供了比标准库 std::process
更便捷的子进程生成原语。
安装
在项目目录中运行以下Cargo命令:
cargo add devx-cmd
或者在Cargo.toml中添加:
devx-cmd = "0.5.0"
示例代码
以下是使用devx-cmd的完整示例:
use devx_cmd::cmd;
fn main() {
// 执行简单命令并获取输出
let output = cmd!("echo", "Hello World").run().unwrap();
println!("Command output: {}", output.stdout_string());
// 执行命令并检查状态
if cmd!("git", "status").run().unwrap().success() {
println!("Git repository is clean");
} else {
println!("Git repository has changes");
}
// 管道命令示例
let piped = cmd!("echo", "hello")
.pipe(cmd!("tr", "[:lower:]", "[:upper:]"))
.run()
.unwrap();
println!("Piped output: {}", piped.stdout_string());
// 带环境变量的命令
let env_output = cmd!("printenv", "MY_VAR")
.env("MY_VAR", "some_value")
.run()
.unwrap();
println!("Env var value: {}", env_output.stdout_string());
}
主要特点
- 简化的命令执行语法
- 内置管道支持
- 方便的环境变量管理
- 更好的错误处理和输出捕获
许可证
该项目采用MIT或Apache-2.0双重许可。
完整示例代码
// 引入devx-cmd库
use devx_cmd::cmd;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 示例1: 执行基本命令并获取输出
let output = cmd!("echo", "Hello devx-cmd").run()?;
println!("基本命令输出: {}", output.stdout_string());
// 示例2: 检查命令执行状态
match cmd!("ls", "-l").run() {
Ok(output) if output.success() => println!("目录列表成功"),
Ok(_) => println!("目录列表命令执行失败"),
Err(e) => println!("执行错误: {}", e),
}
// 示例3: 使用管道处理数据
let processed = cmd!("cat", "Cargo.toml")
.pipe(cmd!("grep", "devx-cmd"))
.run()?;
println!("管道处理结果: {}", processed.stdout_string());
// 示例4: 设置工作目录和环境变量
let env_output = cmd!("pwd")
.current_dir("src")
.env("RUST_BACKTRACE", "1")
.run()?;
println!("工作目录: {}", env_output.stdout_string());
Ok(())
}
使用说明
cmd!
宏接受可变数量的参数,每个参数作为一个命令参数.run()
执行命令并返回结果.pipe()
可以将多个命令连接形成管道.env()
可以设置环境变量.current_dir()
可以设置命令执行的工作目录
1 回复
Rust命令行工具增强库devx-cmd使用指南
概述
devx-cmd是一个Rust库,旨在简化和增强命令行工具的开发体验。它提供了一系列实用功能,帮助开发者快速构建功能丰富的命令行应用,提升开发效率和脚本编写体验。
主要特性
- 简洁的命令行参数解析
- 彩色输出支持
- 进度条显示
- 交互式提示
- 跨平台兼容性
- 错误处理增强
安装方法
在Cargo.toml中添加依赖:
[dependencies]
devx-cmd = "0.1"
基本使用方法
1. 命令行参数解析
use devx_cmd::Cmd;
fn main() {
let cmd = Cmd::new()
.arg("input", "Input file path")
.arg("output", "Output file path")
.flag("verbose", "Enable verbose output")
.parse();
if cmd.flag("verbose") {
println!("Verbose mode enabled");
}
let input = cmd.arg_value("input").unwrap();
let output = cmd.arg_value("output").unwrap();
println!("Processing {} to {}", input, output);
}
2. 彩色输出
use devx_cmd::color;
fn main() {
println!("{} This is red text", color::red("Error:"));
println!("{} This is green text", color::green("Success:"));
println!("{} This is yellow text", color::yellow("Warning:"));
println!("{} This is blue text", color::blue("Info:"));
}
3. 进度条
use devx_cmd::progress;
fn main() {
let mut pb = progress::ProgressBar::new(100, "Processing");
for i in 0..100 {
// 模拟处理过程
std::thread::sleep(std::time::Duration::from_millis(50));
pb.update(i + 1);
}
pb.finish("Done!");
}
4. 交互式提示
use devx_cmd::prompt;
fn main() {
let name = prompt::input("Enter your name: ").unwrap();
let age = prompt::number("Enter your age: ").unwrap();
let confirm = prompt::confirm("Are you sure? ").unwrap();
println!("Name: {}, Age: {}, Confirmed: {}", name, age, confirm);
}
高级功能
1. 命令执行与管道
use devx_cmd::run;
fn main() {
// 执行简单命令
let output = run!("ls -la").unwrap();
println!("{}", output);
// 使用管道
let result = run!("ps aux | grep rust").unwrap();
println!("{}", result);
// 带环境变量
let env_output = run!("echo $HOME", env: [("MY_VAR", "value")]).unwrap();
println!("{}", env_output);
}
2. 表格输出
use devx_cmd::table;
fn main() {
let mut tbl = table::Table::new();
tbl.header(vec!["Name", "Age", "City"]);
tbl.row(vec!["Alice", "25", "New York"]);
tbl.row(vec!["Bob", "30", "London"]);
tbl.row(vec!["Charlie", "35", "Paris"]);
println!("{}", tbl);
}
3. 错误处理增强
use devx_cmd::{Cmd, error::Result};
fn process_file(cmd: &Cmd) -> Result<()> {
let input = cmd.arg_value("input").ok_or("Missing input file")?;
let output = cmd.arg_value("output").ok_or("Missing output file")?;
// 文件处理逻辑...
Ok(())
}
fn main() {
let cmd = Cmd::new()
.arg("input", "Input file")
.arg("output", "Output file")
.parse();
if let Err(e) = process_file(&cmd) {
eprintln!("{} {}", color::red("Error:"), e);
std::process::exit(1);
}
}
实际应用示例
批量文件处理脚本
use devx_cmd::{Cmd, run, progress, color};
fn main() {
let cmd = Cmd::new()
.arg("dir", "Directory to process")
.flag("recursive", "Process recursively")
.parse();
let dir = cmd.arg_value("dir").unwrap();
let recursive = cmd.flag("recursive");
let find_cmd = if recursive {
format!("find {} -type f -name '*.txt'", dir)
} else {
format!("find {} -maxdepth 1 -type f -name '*.txt'", dir)
};
let files = run!(&find_cmd).unwrap();
let file_list: Vec<&str> = files.trim().split('\n').collect();
let mut pb = progress::ProgressBar::new(file_list.len(), "Processing files");
for (i, file) in file_list.iter().enumerate() {
// 处理每个文件
let result = run!(format!("sed -i 's/old/new/g' {}", file));
match result {
Ok(_) => println!("{} Processed: {}", color::green("[OK]"), file),
Err(e) => println!("{} Failed to process {}: {}", color::red("[ERROR]"), file, e),
}
pb.update(i + 1);
}
pb.finish("All files processed");
}
完整示例代码
// 完整的使用devx-cmd构建命令行工具的示例
use devx_cmd::{Cmd, run, progress, color, prompt, table, error::Result};
fn main() -> Result<()> {
// 1. 命令行参数解析
let cmd = Cmd::new()
.arg("action", "Action to perform (process/report)")
.arg("target", "Target directory or file")
.flag("verbose", "Enable verbose output")
.flag("force", "Force operation without confirmation")
.parse();
// 检查verbose标志
if cmd.flag("verbose") {
println!("{} Verbose mode enabled", color::blue("[INFO]"));
}
// 获取参数值
let action = cmd.arg_value("action").ok_or("Missing action")?;
let target = cmd.arg_value("target").ok_or("Missing target")?;
// 2. 根据action执行不同操作
match action.as_str() {
"process" => {
// 3. 交互式确认
if !cmd.flag("force") {
let confirm = prompt::confirm(&format!("Process {}? (y/n) ", target))?;
if !confirm {
println!("{} Operation cancelled", color::yellow("[WARNING]"));
return Ok(());
}
}
// 4. 进度条显示
let mut pb = progress::ProgressBar::new(100, "Processing files");
for i in 0..100 {
std::thread::sleep(std::time::Duration::from_millis(30));
pb.update(i + 1);
}
pb.finish("Processing complete");
// 5. 执行命令
let output = run!("ls -la {}", target)?;
println!("{}", output);
}
"report" => {
// 6. 表格输出
let mut tbl = table::Table::new();
tbl.header(vec!["File", "Size", "Modified"]);
tbl.row(vec!["file1.txt", "1.2KB", "2023-01-01"]);
tbl.row(vec!["file2.txt", "3.4KB", "2023-01-02"]);
tbl.row(vec!["file3.txt", "5.6KB", "2023-01-03"]);
println!("{}", tbl);
}
_ => {
// 7. 错误处理
return Err(format!("Unknown action: {}", action).into());
}
}
Ok(())
}
总结
devx-cmd为Rust命令行工具开发提供了全面的支持,从基本的参数解析到复杂的交互功能,都能显著提升开发效率。通过上述示例,您可以快速上手并集成到自己的项目中,构建更强大、用户友好的命令行工具。