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.