In various bash scripts I have come across the following: $\'\\0\'
An example with some context:
while read -r -d $\'\\0\' line; do
ec
In bash, $'\0'
is precisely the same as ''
: an empty string. There is absolutely no point in using the special Bash syntax in this case.
Bash strings are always NUL-terminated, so if you manage to insert a NUL into the middle of a string, it will terminate the string. In this case, the C-escape \0
is converted to a NUL character, which then acts as a string terminator.
The -d
option of the read
builtin (which defines a line-end character the input) expects a single character in its argument. It does not check if that character is the NUL character, so it will be equally happy using the NUL terminator of ''
or the explicit NUL in $'\0'
(which is also a NUL terminator, so it is probably no different). The effect, in either case, will be to read NUL-terminated data, as produced (for example) by find
's -print0
option.
In the specific case of read -d '' line <<< "$var'
, it is impossible for $var
to have an internal NUL character (for the reasons described above), so line
will be set to the entire value of $var
with leading and trailing whitespace removed. (As @mklement notes, this will not be apparent in the suggested code snippet, because read
will have a non-zero exit status, even though the variable will have been set; read
only returns success if the delimiter is actually found, and NUL cannot be part of a here-string.)
Note that there is a big difference between
read -d '' line
and
read -d'' line
The first one is correct. In the second one, the argument word passed to read
is just -d
, which means that the option will be the next argument (in this case, line
). read -d$'\0' line
will have identical behaviour; in either case, the space is necessary. (So, again, no need for the C-escape syntax).