I'd like to write the following test in an installer script1:
if [ -n "`/etc/grub.d/30_os-prober`" ]; then
install_dual_boot
else
install_linux_only
fi
However, it's also possible that 30_os-prober
produces no output because it somehow failed to complete. If 30_os-prober
fails with a non-zero exit status, it would be safer to assume the a dual-boot situation.
How can I check that 30_os-prober
produced no output successfully?
Basically, I would like to obtain an effect similar to…
if [ -n "`/etc/grub.d/30_os-prober`" ]; then
# Do stuff for a dual-boot machine
install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
# OS probe failed; assume dual boot out of abundance of caution
install_dual_boot
else
install_linux_only
fi
… but without running the same command twice.
1 Background information: 30_os-prober
comes with GRUB2, and the script I am writing is part of my custom configuration for FAI.
Best Answer
First of all, while they are functionally equivalent,
$(…)
is widely considered to be clearer than`…`
— see this, this, and this. Secondly, you don’t need to use$?
to check whether a command succeeded or failed. My attention was recently drawn to Section 2.9.1, Simple Commands of The Open Group Base Specifications for Shell & Utilities (Issue 7):For example,
the exit status of the command
is the exit status from the
ls
, butthe exit status of the command
is the exit status from the
uname
.So ferada’s answer can be streamlined a bit:
Note that it is good practice to use all-upper-case names only for environment variables (or variables to be visible throughout the script). Variables of limited scope are usually named in lower case (or, if you prefer, camelCase).