diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 7d7688650..c7e72f6e2 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -7,8 +7,8 @@ use clap::{crate_version, Arg, ArgAction, Command}; use std::fs::File; use std::io::{stdin, BufRead, BufReader, Read}; use std::path::Path; -use uucore::error::{FromIo, UResult, USimpleError}; -use uucore::{format_usage, help_about, help_section, help_usage}; +use uucore::error::{set_exit_code, FromIo, UResult, USimpleError}; +use uucore::{format_usage, help_about, help_section, help_usage, show_error}; mod helper; @@ -205,9 +205,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { nl(&mut buffer, &mut stats, &settings)?; } else { let path = Path::new(file); - let reader = File::open(path).map_err_context(|| file.to_string())?; - let mut buffer = BufReader::new(reader); - nl(&mut buffer, &mut stats, &settings)?; + + if path.is_dir() { + show_error!("{}: Is a directory", path.display()); + set_exit_code(1); + } else { + let reader = File::open(path).map_err_context(|| file.to_string())?; + let mut buffer = BufReader::new(reader); + nl(&mut buffer, &mut stats, &settings)?; + } } } diff --git a/tests/by-util/test_nl.rs b/tests/by-util/test_nl.rs index 78c8975a8..a00e37a47 100644 --- a/tests/by-util/test_nl.rs +++ b/tests/by-util/test_nl.rs @@ -634,3 +634,20 @@ fn test_empty_section_delimiter() { .stdout_is(" 1\ta\n \n 2\tb\n"); } } + +#[test] +fn test_directory_as_input() { + let (at, mut ucmd) = at_and_ucmd!(); + let dir = "dir"; + let file = "file"; + let content = "aaa"; + + at.mkdir(dir); + at.write(file, content); + + ucmd.arg(dir) + .arg(file) + .fails() + .stderr_is(format!("nl: {dir}: Is a directory\n")) + .stdout_contains(content); +}