aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/run/builtin.rs28
-rw-r--r--src/run/mod.rs1
2 files changed, 29 insertions, 0 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index 99e0103..141357f 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -392,3 +392,31 @@ impl Builtin for null {
Ok(())
}
}
+
+pub struct var;
+impl Builtin for var {
+ fn name(&self) -> &str {
+ "$"
+ }
+
+ fn io(
+ &self,
+ session: Arc<Mutex<Session>>,
+ args: &[BString],
+ _stdin: &mut dyn Read,
+ stdout: &mut dyn Write,
+ ) -> Result {
+ if args.is_empty() {
+ return Err(Error::Exit(-1));
+ } else if args.len() > 1 {
+ return Err(Error::Exit(-2));
+ }
+ let se = session.lock().unwrap();
+ if let Some(val) = se.vars.get(&args[0]) {
+ stdout.write_all(val.as_slice())?;
+ Ok(())
+ } else {
+ Err(Error::Exit(1))
+ }
+ }
+}
diff --git a/src/run/mod.rs b/src/run/mod.rs
index 5605639..679dd44 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -493,6 +493,7 @@ const BUILTINS: &[&'static dyn Builtin] = &[
&builtin::escape,
&builtin::parse,
&builtin::null,
+ &builtin::var,
];
pub fn builtin_map() -> HashMap<BString, &'static dyn Builtin> {