> > Other shells must go out of their way to suppress it, then.
>
> Most of the other shells remove NUL bytes from `read's input.  They
> probably do this before checking the delimiter.


Bash also removes the single quotes before it hits read when the single
quotes are attached to the delimiter option (-d'').

I know its possible to not think of it as a bug, but it can cause very
difficult to find errors because the other behavior -- putting the quoted
argument next to the option -- works when the option value is not null -- a
null delimiter option for read is common and useful -- so I think it's
something worth addressing.

Perhaps it would be possible to put a filter on the Bash interpreter to
check for the case of empty single quotes next to an option and handle it
separately as special case?

*E.g.* my.bsh

#!/bin/bash
echo "$#"
while getopts d: OPTION "$@"; do
 case "$OPTION" in
   d)
     echo "the optarg is ${OPTARG##*=}, optind is ${OPTIND}"
     [[ -z "${OPTARG}" ]] && echo "Let's set the null byte as the delim."
    ;;
 esac
done
exit 0

$> ./my.bsh -d'' arg1  ## Incorrectly interprets arg1 as the option
argument.
2
the optarg is arg1, optind is 3

## If Bash instead would do something like this to preserve the presence of
the null argument I think it would alleviate a potential source of bugs:

$> eval $(echo "./my.bsh -d'' arg1" | sed "s/-d''/-d ''/g")
3
the optarg is , optind is 3
Let's set the null byte as the delim.

+AMD

Reply via email to