On Wed, Mar 6, 2019 at 10:41 PM Kurtis Rader <kra...@skepticism.us> wrote: > > On Wed, Mar 6, 2019 at 1:29 PM SanskritFritz <sanskritfr...@gmail.com> wrote: >> >> Hi and thanks for your answer. >> Indeed this way it works, but I don't understand why, because when I >> test that expression this works: >> string match --regex ' diff .*::[^ ]+ 'aaa'$' "borg diff ::aaa aaa" >> and this doesn't because (commandline) can contain spaces: >> string match --regex ' diff .*::[^ ]+ 'aaa'$' borg diff ::aaa aaa > > > You seem to be under the misapprehension that fish behaves like POSIX shells > (e.g., bash) with respect to command substitution. That is, that the output > of `(commandline)` is split on whitespace. The POSIX equivalent, > `$(commandline)` does split on whitespace. But fish only splits (i.e., > tokenizes) on newlines. So in fish, assuming the command line has a single > line, the output of `(commandline)` is equivalent to the double-quoted string > in your first example. There are various experiments you can do to show this. > For example: > > set var (commandline) > set --show var > > Note that this is also true for var expansion. Try this: > > set var "borg diff ::aaa aaa" > string match --regex ' diff .*::[^ ]+ 'aaa'$' $var > > Notice that `$var` doesn't need to be enclosed in double-quotes. Unlike a > POSIX shell where you do need to quote the var expansion to keep it from > being split on $IFS.
Thank you for this explanation, much appreciated. Now I understand the difference. Cheers. _______________________________________________ Fish-users mailing list Fish-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/fish-users