Chet Ramey <chet.ra...@case.edu> writes: > On 2/14/23 2:58 PM, Dale R. Worley wrote: >>>> Looking at the manual page, it says >>>> >>>> ALIASES >>>> Aliases allow a string to be substituted for a word when it is >>>> used as >>>> the first word of a simple command. >> >> Martin suggested (but IIUC didn't sent to this list): >>> "Beginning of a simple command" should probably be replaced by something >>> more along the lines of "beginning of any command that does not start with >>> a keyword (such as "while", "if", "case", etc) or assignment. >> >> Though I think by "keyword" he means "reserved word". > > I think the issue is that he's applying a grammar interpretation (simple > command) to something that is a completely lexical operation. Alias > expansion happens in the lexical analyzer, and it happens when a token > can potentially be the first word of a simple command.
Well, (1) I'm looking at it based on the *documentation*, which says "simple command". And my essential point is that the documentation should be adjusted to handle this specific case, viz. alias-izing the name of a function that one wants to define without a "function" reserved word. Let me reiterate that, for a lot of these odd points, I'm much more fussy that the documentation describes what Bash does than that I particularly prefer the choice the Bash implementation does. All of that is qualified by (2) The actual workings of aliases are complicated, and as you note, in the lexing rather than the parsing. But contrary to my point (1), I'm willing to tell anyone who uses aliases to modify things that are grammatically salient (rather than command names) that they are in "here be dragons" territory, it's their problem if the documentation doesn't clearly delineate what will happen, and they need to test examples to tell. So then, (3) What is a practical change to the manual page? The first three sentences in version 5.1.0(1) are: ALIASES Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the alias and unalias builtin commands (see SHELL BUILTIN COMMANDS below). The first word of each simple command, if unquoted, is checked to see if it has an alias. I think this change covers the case we're talking about, clarifies the second sentence a bit, and seems to be well-aligned with the more detailed truth: Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The alias and unalias builtin commands (see SHELL BUILTIN COMMANDS below) set and unset aliases. Reserved words may not be aliased, but all other tokens may. A word in a position which could start a simple command, if unquoted, is checked to see if it has an alias. (A side effect is that the function name in a function definition that does not start with the "function" keyword is checked for alias expansion.) Dale