#bash #shell #内置 #可加载 #计数器 #如何 #参数

bash-builtins

该包提供实用程序以实现可用于 bash 的可加载内置函数。

9 个版本

0.4.1 2024 年 3 月 18 日
0.4.0 2024 年 3 月 17 日
0.3.1 2023 年 2 月 15 日
0.3.0 2022 年 7 月 6 日
0.1.3 2021 年 8 月 19 日

#273Rust 模式


用于 cpubind-bash-builtin

Apache-2.0

70KB
971 代码行数

bash-builtins

一个 Rust 包,提供实用程序以实现可用于 bash 的可加载内置函数。

有关如何使用此包的详细说明,请参阅 API 文档

示例

有关更多示例,请参阅 examples 目录

//! Bash builtin to implement a counter.

use bash_builtins::{builtin_metadata, Args, Builtin, BuiltinOptions, Result};
use std::io::{stdout, Write};

builtin_metadata!(
    name = "counter",
    create = Counter::default,
    short_doc = "counter [-r] [-s value] [-a value]",
    long_doc = "
        Print a value, and increment it.

        Options:
          -r\tReset the value to 0.
          -s\tSet the counter to a specific value.
          -a\tIncrement the counter by a value.
    ",
);

#[derive(BuiltinOptions)]
enum Opt {
    #[opt = 'r']
    Reset,

    #[opt = 's']
    Set(isize),

    #[opt = 'a']
    Add(isize),
}

#[derive(Default)]
struct Counter(isize);

impl Builtin for Counter {
    fn call(&mut self, args: &mut Args) -> Result<()> {
        // No options: print the current value and increment it.
        if args.is_empty() {
            // Use writeln!() instead of println!() to avoid
            // panicking if stdout is closed.
            writeln!(stdout(), "{}", self.0)?;

            self.0 += 1;
            return Ok(());
        }

        // Parse options. They can change the value of the counter, but the
        // updated value is stored only if we don't get any error.
        let mut value = self.0;
        for opt in args.options() {
            match opt? {
                Opt::Reset => value = 0,
                Opt::Set(v) => value = v,
                Opt::Add(v) => value += v,
            }
        }

        // It is an error if we receive free arguments.
        args.finished()?;

        // Update the state and exit.
        self.0 = value;
        Ok(())
    }
}

许可证

此包根据 Apache License 2.0 许可证发布,该许可证与 GPLv3 兼容。

有关兼容性的更多信息,请参阅 https://apache.ac.cn/licenses/GPL-compatibility.html

依赖项

~1.5MB
~36K SLoC