Tail and wildcard characters

Solution 1:

I believe you would want:

tail -n 10 *-access.log

As to why:
I don't think it has anything to do with globbing:

tail -10 foo-access.log arf-access.log 
tail: option used in invalid context -- 1

I think it just so happens that your glob expands to one file. It probably has something to do with some archaic options parsing that I am too lazy to try to read, but if you really want to know go look in tail.c in the coreutils source and dissect the following function:

parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units)

Solution 2:

While a bit old, the question is still relevant. I met a similar problem

ssh myserver.com 'tail -2 file-header*'

that gave me the error

tail: option used in invalid context -- 2

however, tailing only one file, like

ssh myserver.com 'tail -2 file-header-file-one'

works fine. Looking at the source tail.c shows that tail starts by parsing obsolete options, then parse the rest (i.e. options not processed yet), regular options. However, parse_obsolete_option() expects an "obsolete" usage, with only one file as argument.
So when providing more files, the function returns immediately, and let the regular parser to choke on -2 (expecting -n 2).

  /* With the obsolete form, there is one option string and at most
     one file argument.  Watch out for "-" and "--", though.  */
  if (! (argc == 2
         || (argc == 3 && ! (argv[2][0] == '-' && argv[2][1]))
         || (3 <= argc && argc <= 4 && STREQ (argv[2], "--"))))
    return false;

In conclusion, it is better to always use the -n regular form, knowing that the "obsolete" code only accepts one file.

Tags:

Linux

Bash