Difference between revisions of "bash/globbing"

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
Jump to navigation Jump to search
(problem, workarounds, TC post)
 
(3 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
Commands invoked via bash always, by default, have each of their arguments parsed via the [[glob]] system facility before being passed to the command.
 
Commands invoked via bash always, by default, have each of their arguments parsed via the [[glob]] system facility before being passed to the command.
==Problem==
+
==Problems==
 
This actively interferes with the ability of programs such as [[grep/file masks|grep]] to behave intuitively when given a file-mask spec as input for processing, because:
 
This actively interferes with the ability of programs such as [[grep/file masks|grep]] to behave intuitively when given a file-mask spec as input for processing, because:
 +
===wildcard obfuscation===
 
* any mask entered will apply only to the current folder.
 
* any mask entered will apply only to the current folder.
 
* folders are only included if their names ''also'' match the mask
 
* folders are only included if their names ''also'' match the mask
 
** ...thus not being useful as far as being the next layer of folders to search; the program will have to get its own directory listing for that.
 
** ...thus not being useful as far as being the next layer of folders to search; the program will have to get its own directory listing for that.
===Workarounds===
+
===inconsistency===
 +
Apparently the file-mask will be passed literally ''if'' no matches are found. (I guess this is useful so the program can say "no matches found for {{arg|filemask}}", but...)
 +
===ambiguity===
 +
If there is a file whose name looks like an option because it begins with "-" or "--", and that file matches the file-mask given, the auto-globbing feature will include it verbatim in such a way that the executable may not be able to tell whether it's part of a file-listing or is actually an option from the command-line.
 +
==Workarounds==
 
Globbing can be turned off on a per-session basis:
 
Globbing can be turned off on a per-session basis:
 
* <code>set -o noglob</code>
 
* <code>set -o noglob</code>
Line 16: Line 21:
 
* <code>help set</code>
 
* <code>help set</code>
 
*: returns more information about bash's <code>set</code> command (the "set" manpage is for something else)
 
*: returns more information about bash's <code>set</code> command (the "set" manpage is for something else)
 +
* Explicitly enclosing the filemask in quotes (double or single) suppresses auto-globbing. <code>bash</code> will strip off the quotes but not parse the contents.
 +
** The same is true for backslash-escaping the "*" character, as in <code>\*.log</code>
 +
 +
==Related==
 +
* [[grep/file masks]]
 +
* [[PHP/file/glob]]: globbing functions in PHP
  
The user can bypass globbing (and other special-character processing) by enclosing the file-mask in quotes (single or double). bash will strip off the quotes but not parse the contents.
 
 
==Links==
 
==Links==
 
* {{l/manpage|glob}}
 
* {{l/manpage|glob}}
 
* {{wikipedia|glob (programming)}}
 
* {{wikipedia|glob (programming)}}
 +
* [https://mywiki.wooledge.org/glob Greg's Wiki]
 
* [https://www.php.net/manual/en/function.glob.php PHP: glob]
 
* [https://www.php.net/manual/en/function.glob.php PHP: glob]
 
* '''2020-02-04''' [https://toot.cat/@woozle/103603799224715530 Linux hot take: bash bashing]
 
* '''2020-02-04''' [https://toot.cat/@woozle/103603799224715530 Linux hot take: bash bashing]

Latest revision as of 23:51, 3 September 2022

The following notes may apply to other shell environments besides bash, but have only been tested with bash.

Commands invoked via bash always, by default, have each of their arguments parsed via the glob system facility before being passed to the command.

Problems

This actively interferes with the ability of programs such as grep to behave intuitively when given a file-mask spec as input for processing, because:

wildcard obfuscation

  • any mask entered will apply only to the current folder.
  • folders are only included if their names also match the mask
    • ...thus not being useful as far as being the next layer of folders to search; the program will have to get its own directory listing for that.

inconsistency

Apparently the file-mask will be passed literally if no matches are found. (I guess this is useful so the program can say "no matches found for <filemask>", but...)

ambiguity

If there is a file whose name looks like an option because it begins with "-" or "--", and that file matches the file-mask given, the auto-globbing feature will include it verbatim in such a way that the executable may not be able to tell whether it's part of a file-listing or is actually an option from the command-line.

Workarounds

Globbing can be turned off on a per-session basis:

  • set -o noglob
    turns off globbing
    put it in ~/.bashrc to make it the default
  • set +o noglob
    turns globbing back on
  • help set
    returns more information about bash's set command (the "set" manpage is for something else)
  • Explicitly enclosing the filemask in quotes (double or single) suppresses auto-globbing. bash will strip off the quotes but not parse the contents.
    • The same is true for backslash-escaping the "*" character, as in \*.log

Related

Links