summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-12-26 02:35:27 -0500
committerJesse Luehrs <doy@tozt.net>2021-12-26 02:35:27 -0500
commitfc3449b2f10fb6dbb8945f05d55353b41b818345 (patch)
treeb15ee5c6de5201a1049910c7a75cdde719190041 /src
parentfb655d3c877bee84f5d573bdef9a75a2dd3663fa (diff)
downloadnbsh-fc3449b2f10fb6dbb8945f05d55353b41b818345.tar.gz
nbsh-fc3449b2f10fb6dbb8945f05d55353b41b818345.zip
couple more builtins
Diffstat (limited to 'src')
-rw-r--r--src/state/history/builtins.rs26
-rw-r--r--src/state/history/mod.rs9
2 files changed, 34 insertions, 1 deletions
diff --git a/src/state/history/builtins.rs b/src/state/history/builtins.rs
index 1bf9d00..e999035 100644
--- a/src/state/history/builtins.rs
+++ b/src/state/history/builtins.rs
@@ -43,6 +43,14 @@ static BUILTINS: once_cell::sync::Lazy<
builtins
.insert("and", coerce_builtin(&|exe, env| Box::pin(and(exe, env))));
builtins.insert("or", coerce_builtin(&|exe, env| Box::pin(or(exe, env))));
+ builtins.insert(
+ "command",
+ coerce_builtin(&|exe, env| Box::pin(command(exe, env))),
+ );
+ builtins.insert(
+ "builtin",
+ coerce_builtin(&|exe, env| Box::pin(builtin(exe, env))),
+ );
builtins
});
@@ -129,6 +137,24 @@ async fn or(
*env.latest_status()
}
+async fn command(
+ exe: &crate::parse::Exe,
+ env: &super::ProcessEnv,
+) -> async_std::process::ExitStatus {
+ let exe = exe.shift();
+ super::run_binary(&exe, env).await;
+ *env.latest_status()
+}
+
+async fn builtin(
+ exe: &crate::parse::Exe,
+ env: &super::ProcessEnv,
+) -> async_std::process::ExitStatus {
+ let exe = exe.shift();
+ run(&exe, env).await;
+ *env.latest_status()
+}
+
fn home() -> std::path::PathBuf {
std::env::var_os("HOME").unwrap().into()
}
diff --git a/src/state/history/mod.rs b/src/state/history/mod.rs
index e198ba3..1df2f67 100644
--- a/src/state/history/mod.rs
+++ b/src/state/history/mod.rs
@@ -637,9 +637,16 @@ async fn run_exe(
env: &ProcessEnv,
) -> async_std::process::ExitStatus {
if let Some(status) = builtins::run(exe, env).await {
- return status;
+ status
+ } else {
+ run_binary(exe, env).await
}
+}
+async fn run_binary(
+ exe: &crate::parse::Exe,
+ env: &ProcessEnv,
+) -> async_std::process::ExitStatus {
let mut process = async_std::process::Command::new(exe.exe());
process.args(exe.args());
let size = env.entry().await.vt.screen().size();