On Thu, Nov 24, 2022 at 09:32:45PM +0900, Yoichi Nakayama wrote: > > Good point. The vim version is easier to fix (we just need to > > double-quote \$1 inside the eval), but the fact that nobody has > > complained is an indication that it does not really matter. > > I've confirmed the vim version is fixed by > eval "$editor -q \"\$1\"" > > With your hint, I found the emacs version can be fixed > by single-quoting the variable (I found a mistake in the > emacs version. Since there is only one argument, I > should use $1 instead of $@. I'll fix it.), and the vim > version can be also in the similar form with single quote: > eval "$editor -q '$1'" This isn't quite a full solution, though. The "$1" is expanded by the outer double-quoted string, which is then fed to eval. The inner single-quotes make most characters literally except for single-quotes themselves. So if $1 has single-quotes, the eval will barf due to bad syntax. > The original vim version used the notation \$1 instead of $1. > I'm worried that the emacs version might need the backslash. > What does the backslash mean? Is it necessary? As you figured out in the other email, it inhibits the outer layer of expansion, and lets the eval expand it. This is the easiest way to pass things through levels of shell evals (since otherwise you have to actually quote, which is a real pain). None of this is sufficient for your emacs example, though. There you have three levels of quoting: - getting the argument intact into the eval; this can use the "\$" trick - the argument then appears inside a double-quoted string which will be evaluated by emacs. You'd want to protect it against double-quotes and presumably backslashes. - emacs will then execute the final command, presumably you a shell. So you'd want to protect against expansion in that shell. The easiest way to do that is usually to wrap each argument in single-quotes, and quoting against interior single quotes (by ending single-quote, adding a single backslashed single-quote, and then re-opening the single-quote). It's horribly ugly, but is (AFAIK) the shortest way to quote shell arguments, and what we usually do in Git. Those are the three tricks I sent in the earlier email (though looking at it again, I think the single-quote bits need to come first, so their backslashes are then quoted to protect against emacs evaluation). It's all quite confusing, which is why I am OK with just skipping it for now. ;) The nice thing, though, is that doing the quoting right means it's safe to get rid of the "cat", which solves your race problems in a more direct and robust way. -Peff