On 8/3/18 9:29 AM, Thomas Deutschmann wrote: > Hi, > > please see the following script: > >> #!/bin/bash >> shopt -s failglob >> if [[ $? -ne 0 ]]; then >> echo 'shopt failed' >> exit 1 >> fi >> >> # Let's view current options just to be sure >> shopt -p >> >> # The following glob should fail because /foo/bar does not exist ... >> # Due to 'failglob' option, bash should stop here >> echo /foo/bar/* >> >> # This code should never run if previous glob failed >> echo Still alive > > Is the assumption true that "Still alive" should *never* be printed > when "/foo/bar" does not exist?
It might be an assumption, but it's not correct. The documentation says that failglob affects the command: "If the failglob shell option is set, and no matches are found, an error message is printed and the command is not executed." > When you add "set -e" to the beginning, execution will stop immediately > after the failing glob, i.e. no "Still alive" will be printed. Because set -e will cause the shell to exit when a command fails. > > However, see the following interesting difference between semicolons and > newlines: > >> $ echo "shopt -s failglob; echo /foo/bar/*; echo alive; " | bash >> bash: line 1: no match: /foo/bar/* >> $ echo "shopt -s failglob; echo /foo/bar/*; echo alive; " | sed 's:; :\n:g' >> | bash >> bash: line 2: no match: /foo/bar/* >> alive >> $ echo "set -e; shopt -s failglob; echo /foo/bar/*; echo alive; " | sed 's:; >> :\n:g' | bash >> bash: line 3: no match: /foo/bar/* The failglob option affects the command. The `difference' between a line and multiple lines is that bash always reads at least one complete line of input before parsing and executing any of the commands on that line. As a result: shopt -s failglob; echo /foo/bar/*; echo alive is a single compound command, and shopt -s failglob echo /foo/bar/* echo alive is three simple commands. So failglob causes the current command to fail, which means the compound command (first case) or the simple command (second case). `failglob' has behaved this way since it was introduced in bash-3.0. -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRU c...@case.edu http://tiswww.cwru.edu/~chet/
signature.asc
Description: OpenPGP digital signature