Search code examples
bashumount

Bash umount command substitution


I'm running RHEL 7 and bash here. It seems command substitution does not work for the umount command. It does, however, work as usual for other commands. For example:

[root@localhost ~]# msg=$(umount /u01)
umount: /u01: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@localhost ~]# echo "$msg"
- nothing here -


[root@localhost ~]# msg=$(mountpoint /u01)
[root@localhost ~]# echo "$msg"
/u01 is a mountpoint

What I can probably do is to use mountpoint first and then umount if the mountpoint exists. Then check for umount status - if there is an error I guess the device must be busy.


Solution

  • It's probably the umount writes those errors to standard error output stream. With command-substitution $(..), you can only capture the standard output stream. The right fix for the same would be

    msg="$(umount /u01 2>&1)"
    

    But instead of relying on the verbose information, you can rely on the exit codes of those commands, i.e. first check

    if mountpoint /u01 2>&1 > /dev/null; then
        if ! umount /u01 2>&1 > /dev/null; then
            printf '%s\n' "/u01 device must be busy"
        else
            printf '%s\n' "/u01 device is mounted"
        fi
    fi
    

    The above version safely nullifies the output strings produced by both those commands, and only prints the mount status of the device. The part 2>&1 >/dev/null in short means, re-direct all standard error to standard output and combined put them to the null device, so that they are visible on the terminal window.