Thomas Schmitt
2024-07-24 13:40:01 UTC
Hi,
maybe i am just too dumb to read the manual, or maybe i made an
archeological discovery in the shells we use.
I came to a strange shell gesture which i find neither in man bash nor
man dash. Nevertheless it works the same in both shells.
GRUB's test scripts often show this gesture
: "${TMPDIR=/tmp}"
Well known and described is
${X:=Y}
which assigns a default value to variable X if it is empty (man bash
says: "If [...] unset or null").
Also known and described is ":", the no-op command.
So
: "${TMPDIR:=/tmp}"
would not be a riddle. But "=" instead ":=" causes a subtle change in
behavior. A defined but empty variable does not get the default content:
$ unset x
$ : ${x=YYY}
$ echo $x
YYY
$ x=
$ : ${x=YYY}
$ echo $x
$
With ":=" the empty variable gets a new stuffing:
$ : ${x:=YYY}
$ echo $x
YYY
$
The dash shell instead of bash shows the same behavior.
Is this legacy behavior ?
Are there shells which do ${X=Y} but not ${X:=Y} ?
--------------------------------------------------------------------
Reason why i ask:
I came to that gesture while trying to find out why a run of GRUB's
"make check" as superuser left a lot of empty directories in the
/-directory, Most GRUB tests do early
: "${TMPDIR=/tmp}"
or use variable expansion with default value: ${TMPDIR:-/tmp}
But tests/grub_cmd_cryptomount uses TMPDIR naively so that its test
directories end up as
/1718898505.LUKS1_test_cryptsetup_defaults
...
/1718912880.LUKS2_test_with_second_key_slot_and_first_slot_using_different_password
I would like to talk GRUB into using ${X:=Y} generally, because it does
not matter whether TMPDIR is defined empty or is unset.
So i need background knowledge about the currently used ${X=Y}.
(One may say that is not a good idea to run a test as superuser.
But most GRUB tests create and mount filesystems. So after a change in
the tool grub-fstest i had to do it as superuser to check for new test
failures caused by my change. It was only one and that was expected.)
Have a nice day :)
Thomas
maybe i am just too dumb to read the manual, or maybe i made an
archeological discovery in the shells we use.
I came to a strange shell gesture which i find neither in man bash nor
man dash. Nevertheless it works the same in both shells.
GRUB's test scripts often show this gesture
: "${TMPDIR=/tmp}"
Well known and described is
${X:=Y}
which assigns a default value to variable X if it is empty (man bash
says: "If [...] unset or null").
Also known and described is ":", the no-op command.
So
: "${TMPDIR:=/tmp}"
would not be a riddle. But "=" instead ":=" causes a subtle change in
behavior. A defined but empty variable does not get the default content:
$ unset x
$ : ${x=YYY}
$ echo $x
YYY
$ x=
$ : ${x=YYY}
$ echo $x
$
With ":=" the empty variable gets a new stuffing:
$ : ${x:=YYY}
$ echo $x
YYY
$
The dash shell instead of bash shows the same behavior.
Is this legacy behavior ?
Are there shells which do ${X=Y} but not ${X:=Y} ?
--------------------------------------------------------------------
Reason why i ask:
I came to that gesture while trying to find out why a run of GRUB's
"make check" as superuser left a lot of empty directories in the
/-directory, Most GRUB tests do early
: "${TMPDIR=/tmp}"
or use variable expansion with default value: ${TMPDIR:-/tmp}
But tests/grub_cmd_cryptomount uses TMPDIR naively so that its test
directories end up as
/1718898505.LUKS1_test_cryptsetup_defaults
...
/1718912880.LUKS2_test_with_second_key_slot_and_first_slot_using_different_password
I would like to talk GRUB into using ${X:=Y} generally, because it does
not matter whether TMPDIR is defined empty or is unset.
So i need background knowledge about the currently used ${X=Y}.
(One may say that is not a good idea to run a test as superuser.
But most GRUB tests create and mount filesystems. So after a change in
the tool grub-fstest i had to do it as superuser to check for new test
failures caused by my change. It was only one and that was expected.)
Have a nice day :)
Thomas