diff --git a/src/libstd/sys/unix/process/process_unix.rs b/src/libstd/sys/unix/process/process_unix.rs index f41bd2c20720a..3a3ae45f025b2 100644 --- a/src/libstd/sys/unix/process/process_unix.rs +++ b/src/libstd/sys/unix/process/process_unix.rs @@ -17,6 +17,16 @@ use ptr; use sys::cvt; use sys::process::process_common::*; +#[cfg(all(not(target_os = "android"), not(target_env = "musl")))] +const DEFAULT_PATH: &[u8] = b"/bin:/usr/bin"; +// Musl has a different default path. +#[cfg(target_env = "musl")] +const DEFAULT_PATH: &[u8] = b"/usr/local/bin:/bin:/usr/bin"; +// Android has a different default path. +#[cfg(target_os = "android")] +const DEFAULT_PATH: &[u8] = b"/sbin:/system/sbin:/system/bin:/system/xbin:\ + /odm/bin:/vendor/bin:/vendor/xbin"; + //////////////////////////////////////////////////////////////////////////////// // Command //////////////////////////////////////////////////////////////////////////////// @@ -135,14 +145,15 @@ impl Command { Some(envp) => { match envp.get_items().iter().find(|var| var.as_bytes().starts_with(b"PATH=")) { Some(p) => &p.as_bytes()[5..], - None => return None, + // If there's no PATH, fall back to the default (which varies by platform). + None => DEFAULT_PATH, } }, // maybe_envp is None if the process isn't changing the parent's env at all. None => { match parent_path.as_ref() { Some(p) => p.as_bytes(), - None => return None, + None => DEFAULT_PATH, } }, }; diff --git a/src/test/run-pass/command-exec.rs b/src/test/run-pass/command-exec.rs index 96f9da67790fc..0352161d7ddff 100644 --- a/src/test/run-pass/command-exec.rs +++ b/src/test/run-pass/command-exec.rs @@ -55,6 +55,16 @@ fn main() { println!("passed"); } + "exec-test6" => { + let err = Command::new("echo").arg("passed").env_clear().exec(); + panic!("failed to spawn: {}", err); + } + + "exec-test7" => { + let err = Command::new("echo").arg("passed").env_remove("PATH").exec(); + panic!("failed to spawn: {}", err); + } + _ => panic!("unknown argument: {}", arg), } return @@ -84,4 +94,14 @@ fn main() { assert!(output.status.success()); assert!(output.stderr.is_empty()); assert_eq!(output.stdout, b"passed\n"); + + let output = Command::new(&me).arg("exec-test6").output().unwrap(); + assert!(output.status.success()); + assert!(output.stderr.is_empty()); + assert_eq!(output.stdout, b"passed\n"); + + let output = Command::new(&me).arg("exec-test7").output().unwrap(); + assert!(output.status.success()); + assert!(output.stderr.is_empty()); + assert_eq!(output.stdout, b"passed\n"); }