【问题标题】:Bash umount command substitutionbash umount 命令替换
【发布时间】:2019-05-10 06:17:24
【问题描述】:

我在这里运行 RHEL 7 和 bash。似乎命令替换不适用于 umount 命令。但是,对于其他命令,它确实可以正常工作。例如:

[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

我可以做的是先使用挂载点,然后如果挂载点存在则卸载。然后检查 umount 状态 - 如果有错误我猜设备一定是忙。

【问题讨论】:

    标签: bash umount


    【解决方案1】:

    可能是umount 将这些错误写入标准错误输出流。使用命令替换$(..),您只能捕获标准输出流。正确的解决方法是

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

    但你可以依赖这些命令的退出代码,而不是依赖详细信息,即首先检查

    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
    

    以上版本安全地使这两个命令产生的输出字符串无效,并且只打印设备的安装状态。 2>&1 >/dev/null 部分简而言之,将所有标准错误重定向到标准输出,并组合到空设备中,以便在终端窗口中可见。

    【讨论】:

    • 是的,将 stderr 重定向到 stdout 可用于命令替换。但我不明白为什么有必要这样做。通常不是将 stderr 和 stdout 重定向到屏幕吗?当我通过键盘执行 umount 时,我在屏幕上看到了 stderr 输出。
    • 无论如何,非常感谢使用 mountpoint 的好技巧和示例。
    • @Dude:这是 Linux 世界的普遍意识形态,总是将错误与正常输出分开。请记住,两个流都进入终端 tty,但只是 $(..) 仅捕获 stdout 而不是 stderr
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多