From f52c0655c78f27465846ce00ce16f645aa3bcd5c Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Thu, 28 Nov 2019 08:49:48 -0800 Subject: [PATCH] expand tilde in externals original: 9f42d7693fa4c1022ab6b585ac8657f93f8bb67c --- src/commands/classified/external.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/commands/classified/external.rs b/src/commands/classified/external.rs index 3deca1126..3ddb7a327 100644 --- a/src/commands/classified/external.rs +++ b/src/commands/classified/external.rs @@ -71,6 +71,8 @@ pub(crate) async fn run_external_command( arg_string.push_str(&arg); } + let home_dir = dirs::home_dir(); + trace!(target: "nu::run::external", "command = {:?}", command.name); let mut process; @@ -102,6 +104,13 @@ pub(crate) async fn run_external_command( if arg.chars().all(|c| c.is_whitespace()) { None } else { + // Let's also replace ~ as we shell out + let arg = if let Some(ref home_dir) = home_dir { + arg.replace("~", home_dir.to_str().unwrap()) + } else { + arg.replace("~", "~") + }; + Some(arg.replace("$it", &i)) } }); @@ -113,13 +122,20 @@ pub(crate) async fn run_external_command( } else { process = Exec::cmd(&command.name); for arg in command.args.iter() { + // Let's also replace ~ as we shell out + let arg = if let Some(ref home_dir) = home_dir { + arg.replace("~", home_dir.to_str().unwrap()) + } else { + arg.replace("~", "~") + }; + let arg_chars: Vec<_> = arg.chars().collect(); if arg_chars.len() > 1 && arg_chars[0] == '"' && arg_chars[arg_chars.len() - 1] == '"' { // quoted string let new_arg: String = arg_chars[1..arg_chars.len() - 1].iter().collect(); process = process.arg(new_arg); } else { - process = process.arg(arg.arg.clone()); + process = process.arg(arg.clone()); } } }