On 16Apr2019 18:40, felixs <besteck...@gmail.com> wrote:
On Tue, Apr 16, 2019 at 09:52:57AM +1000, Cameron Simpson wrote:
Globbing is used to construct command line arguments. But a redirection is
not a command line parameter - it is only subject to parameter substitution
- $blah.

Ok, got it. Globbing = filename expansion, as to the Bash Reference
Manual.

Yes. Expanding unquoted "*" etc to match multiple pathnames and putting those names in place of the pattern.

Just to understand: the "${file}.out" in the variable assignment
Derek used is an example of a filename expansion, i.e. a special form of it,
because it does not expand to just one filename but a set of filenames,
that make up the directory?

No, this is parameter substitution (there's a section in the manual titled PARAMETER SUBTITUTION). Parameters are shell variables like $file or ${file} or the other variations on ${.....} which can be used. They are string expansions which come from shell variables, and they don't probe the filesystem to find out what files may be lying around.

By contrast, globbing aka filename expansion is a separate step in the shell command line construction which happens _after_ parameter subtitution. It recognised unquoted '*' and '[range]' sequences and probes the filesystem for matching paths.

Look:

 [~]fleet*> x='b*'
 [~]fleet*> echo b*
 bin bin-cs bin-darwin bin-local books bos build
 [~]fleet*> echo $x
 bin bin-cs bin-darwin bin-local books bos build
 [~]fleet*> echo "$x"
 b*

Here we set $b to "b*", then use it in various ways.

First, a literal "b*" to see what it expands to.

Second: by using $x to get the "b*"; because the $x is unquoted, _after_ expanding $x, the resulting "b*" is used for globbing, and is expanded to the various "b"-starting things in my home directory.

Third: by using "$x" to get the "b*". After expansion, we get "b*" from $x. The globbing step still happens, but because the "*" is from the quoted section it is not expanded.

(Or is it, therefore, an array?). I tend to say
"set", because in Python3 these braces would enclose a set, but maybe this
is misleading.

It is misleading. The ${} markers are just punctuation. Consider:

 x=a
 echo ${x}a
 echo ${xa}

The first echo accesses the "$x" variable. The second one accesses the "$xa" variable. If you want a Python comparison, thinnk of the {} markers in a format string:

 print("{x}a")

versus:

 print("{xa}")

except that in a format string the markers are mandatory. In the shell the convenience bare form "$x" is what is usually used. The {} markers lets you specificly delineate the start and end of the variable name, which is useful when the name is followed by letters which would otherwise be considered part of the name.

As an added bonus, once you are using ${....} you can put extra syntax inside the {} markers such as:

 echo ${x:-3}

which inserts the value of $x unless it is empty or unset, in which case it inserts "3".

Python isn't a good comparison lanuage here because as far as parameter substitution and globbing go, the shell is a kind of macro language: the concrete commands issued are from _after_ the macros (parameters and globbing) are expanded.

Python is not like that.

Reply via email to