diff --git a/CHANGELOG.md b/CHANGELOG.md index bfb30029..79546af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ ## Bugfixes +- Prevent fork nightmare with `PAGER=batcat`. See #2235 (@johnmatthiggins) + ## Other - Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp) diff --git a/src/pager.rs b/src/pager.rs index 3473aa67..5b707779 100644 --- a/src/pager.rs +++ b/src/pager.rs @@ -40,15 +40,23 @@ impl PagerKind { fn from_bin(bin: &str) -> PagerKind { use std::path::Path; - match Path::new(bin) - .file_stem() - .map(|s| s.to_string_lossy()) - .as_deref() - { - Some("bat") => PagerKind::Bat, + // Set to `less` by default on most Linux distros. + let pager_bin = Path::new(bin).file_stem(); + + // The name of the current running binary. Normally `bat` but sometimes + // `batcat` for compatibility reasons. + let current_bin = env::args_os().next(); + + // Check if the current running binary is set to be our pager. + let is_current_bin_pager = current_bin + .map(|s| Path::new(&s).file_stem() == pager_bin) + .unwrap_or(false); + + match pager_bin.map(|s| s.to_string_lossy()).as_deref() { Some("less") => PagerKind::Less, Some("more") => PagerKind::More, Some("most") => PagerKind::Most, + _ if is_current_bin_pager => PagerKind::Bat, _ => PagerKind::Unknown, } }