aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Maier <>2026-03-07 13:22:18 +0100
committerJonas Maier <>2026-03-07 13:22:18 +0100
commita4c61ccccc5a83a8d9506d996fd695104ef14e2d (patch)
tree87068d4951c03963db46b5acdf592b1c1cae8111
parent448a7dd10fbd369e56e7a17e650b4d1c760e3bd1 (diff)
downloadpish-a4c61ccccc5a83a8d9506d996fd695104ef14e2d.tar.gz
can read cli args
-rw-r--r--src/run/mod.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs
index 4970792..f32007e 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -229,8 +229,24 @@ impl parse::Expander for Executor {
type Error = ExecError;
fn expand_var(&mut self, var: BString) -> Result<BString, Self::Error> {
+ if var.is_empty() {
+ return Err(ExecError::UnknownVariable(var));
+ }
+
+ if var[0].is_ascii_digit() {
+ if let Some(x) = String::from_utf8(var.clone())
+ .ok()
+ .and_then(|x| x.parse::<usize>().ok())
+ {
+ match std::env::args_os().skip(x).next() {
+ Some(arg) => return Ok(arg.into_encoded_bytes()),
+ None => (),
+ }
+ }
+ }
+
if let Some(val) = self.se.lock().unwrap().vars.get(&var) {
- return Ok(val.clone())
+ return Ok(val.clone());
}
match std::env::var_os(OsStr::from_bytes(&var)) {