@@ -99,7 +99,7 @@ fn is_flag(arg: &OsStr, options: &mut Options) -> bool {
9999///
100100/// - Vector of non-flag arguments.
101101/// - [`Options`], describing how teh arguments should be interpreted.
102- fn filter_flags ( mut args : impl uucore :: Args ) -> ( Vec < OsString > , Options ) {
102+ fn filter_flags ( mut args : impl Iterator < Item = OsString > ) -> ( Vec < OsString > , Options ) {
103103 let mut arguments = Vec :: with_capacity ( args. size_hint ( ) . 0 ) ;
104104 let mut options = Options :: default ( ) ;
105105
@@ -124,7 +124,7 @@ fn filter_flags(mut args: impl uucore::Args) -> (Vec<OsString>, Options) {
124124#[ uucore:: main]
125125pub fn uumain ( args : impl uucore:: Args ) -> UResult < ( ) > {
126126 // args[0] is the name of the binary.
127- let mut args = args. skip ( 1 ) . peekable ( ) ;
127+ let args: Vec < OsString > = args. skip ( 1 ) . collect ( ) ;
128128
129129 // Check POSIX compatibility mode
130130 //
@@ -139,28 +139,36 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
139139 // > representation. For example, echo -e '\x2dn'.
140140 let is_posixly_correct = env:: var_os ( "POSIXLY_CORRECT" ) . is_some ( ) ;
141141
142- let ( args, options) = match is_posixly_correct {
143- // if POSIXLY_CORRECT is not set we filter the flags normally
144- false => filter_flags ( args) ,
145-
146- true if args. peek ( ) . is_some_and ( |arg| arg == "-n" ) => {
142+ let ( args, options) = if is_posixly_correct {
143+ if args. first ( ) . is_some_and ( |arg| arg == "-n" ) {
147144 // if POSIXLY_CORRECT is set and the first argument is the "-n" flag
148145 // we filter flags normally but 'escaped' is activated nonetheless.
149- let ( args, _) = filter_flags ( args) ;
146+ let ( args, _) = filter_flags ( args. into_iter ( ) ) ;
150147 (
151148 args,
152149 Options {
153150 trailing_newline : false ,
154151 ..Options :: posixly_correct_default ( )
155152 } ,
156153 )
157- }
158-
159- true => {
154+ } else {
160155 // if POSIXLY_CORRECT is set and the first argument is not the "-n" flag
161- // we just collect all arguments as every argument is considered an argument .
162- ( args. collect ( ) , Options :: posixly_correct_default ( ) )
156+ // we just collect all arguments as no arguments are interpreted as flags .
157+ ( args, Options :: posixly_correct_default ( ) )
163158 }
159+ } else if args. len ( ) == 1 && args[ 0 ] == "--help" {
160+ // If POSIXLY_CORRECT is not set and the first argument
161+ // is `--help`, GNU coreutils prints the help message.
162+ //
163+ // Verify this using:
164+ //
165+ // POSIXLY_CORRECT=1 echo --help
166+ // echo --help
167+ uu_app ( ) . print_help ( ) ?;
168+ return Ok ( ( ) ) ;
169+ } else {
170+ // if POSIXLY_CORRECT is not set we filter the flags normally
171+ filter_flags ( args. into_iter ( ) )
164172 } ;
165173
166174 execute ( & mut io:: stdout ( ) . lock ( ) , args, options) ?;
0 commit comments