What is the meaning of ${GZIP_BINDIR-'/bin'} in bash?
${GZIP_BINDIR-'/bin'}
is a bash
parameter expansion pattern. From man bash
:
${parameter:-word}
Use Default Values. If parameter is unset or null,
the expansion of word is substituted. Otherwise, the value of parameter
is substituted.
Immediately prior to this portion man page has (thanks to @jwodder for notifying):
Omitting the colon results in a test only for a parameter that is unset.
As the manpage says, it will set the default value of the variable GZIP_BINDIR
. If GZIP_BINDIR
has a value previously set (other than null as you are not using :
) then that value will be used, otherwise /bin
will be used as the value of the variable GZIP_BINDIR
.
On the other hand if you want to test for null values too, use this pattern (include :
):
${GZIP_BINDIR:-'/bin'}
After that the $PATH
will be expanded to the values it was holding before. So, if PATH
previously had:
/usr/sbin:/usr/bin
Now your PATH
will be (considering GZIP_BINDIR
is not set):
/bin:/usr/sbin:/usr/bin
export PATH
will make this PATH
available to all the child processes.
Is there really no colon before the hyphen inside the parameter expansion ${GZIP_BINDIR-'/bin'}
?
This kind of construct is almost always written with a colon, as in ${GZIP_BINDIR:-'/bin'}
which means, "if $GZIP_BINDIR is NULL or unset, set it to '/bin'"
However, the syntax you supplied is valid, but rare. ${GZIP_BINDIR-'/bin'}
(no colon) means, "if $GZIP_BINDIR is unset, set it to '/bin'". If it is set (has been declared) but nothing assigned to it (e.g. it is NULL) nothing will be inserted.
There may be a bug here though as the colon following the variable construct (...}:
$PATH...) will still be inserted if $GZIP_BINDIR is set but NULL. Since this would add a colon at the beginning of the $PATH, it will cause the current directory to be searched first.
That is considered by most to be a security problem since it makes it easier to cause a malicious program with the same name as standard commands to be run just by putting it in the current directory.
To leave $PATH unchanged if $GZIP_BINDIR is set but NULL (empty), the correct syntax would be ${GZIP_BINDIR-'/bin:'}$PATH; export PATH
To leave $PATH unchanged if $GZIP_BINDIR is either unset or is set but NULL, the correct syntax would be ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH
This command update the PATH variable.
The PATH
is an environment variable specifying a set of directories where executable programs are located.
PATH="${GZIP_BINDIR-'/bin'}:$PATH";
This add the value of another variable GZIP_BINDIR
if exit to the previous PATH else use /bin instead and add it to PATH
export PATH
export is used to set the PATH available for all child processes and subshells Read this for more information about
You must note that this is not static and you'll loose it once you exit your shell.
In order to make this PATH edit permanent you have to append these lines to your .bashrc
gedit .bashrc
and add the line
export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
then run the command
source .bashrc