【问题标题】:How to add automatic prefix before bash command ([prefix] docker exec)如何在 bash 命令之前添加自动前缀([prefix] docker exec)
【发布时间】:2020-03-18 08:27:03
【问题描述】:

我想问是否有办法在某些命令之前添加前缀。关于 SO 的大多数类似问题都涉及在命令的输出中添加前缀,而不是在命令执行本身中添加前缀,所以这是我的示例:
我需要连接到 docker 容器,我在 Windows 上工作并使用带有 bash 终端的 ConEmu,所以我需要使用 winpty 前缀才能连接到容器的 unix 终端,如下所示:

docker exec -it my_container bash 

结果:

unable to setup input stream: unable to set IO streams as raw terminal: The handle is invalid.

所以我需要使用:

winpty docker exec -it my_container bash

root@0991eb946acc:/var/www/my_container#

不幸的是,如果我从乞求的 winpty 添加,我的自动完成不起作用,所以我需要先编写 docker 命令,然后跳转到命令的开头输入 winpty。我想让 bash 自动检测每当我运行“docker exec”在它之前添加 winpty 前缀。 如何做到这一点? 我知道我可以为

alias de='winpty docker exec'

但我宁愿继续使用正常的 docker 命令流来自动完成。

【问题讨论】:

    标签: bash docker terminal


    【解决方案1】:

    编写一个包装docker 的shell 函数。如果是docker exec 命令调用winpty,否则使用command 回退到底层docker 二进制。

    docker() {
        if [[ ${1:-} == exec ]]; then
            (set -x; winpty docker "$@")
        else
            command docker "$@"
        fi
    }
    

    我把set -x 放在那里,这样它就会在winpty 被调用时打印出来,这样就没有隐藏的魔法了。当我的 shell 做鬼鬼祟祟的事情时,我喜欢被提醒。

    $ docker exec -it my_container bash
    + winpty docker exec -it my_container bash
    root@0991eb946acc:/var/www/my_container#
    

    我不熟悉 winpty,但我希望 winpty docker 会调用 docker 二进制文件而不是这个 shell 函数。但是如果我错了,你就有麻烦了,因为它会在一个无限的递归循环中一遍又一遍地调用自己。哎呀!如果发生这种情况,您可以使用which 确保它调用二进制文件。

    docker() {
        if [[ ${1:-} == exec ]]; then
            (set -x; winpty "$(which docker)" "$@")
        else
            command docker "$@"
        fi
    }
    

    如果您想了解 shell 语法:

    • ${1} 是函数的第一个参数。
    • ${1:-} 可确保您在启用 set -u 以检测未设置变量的情况下不会收到“未绑定变量”错误。
    • "$@" 是一个包含所有函数参数的数组。

    【讨论】:

    • 谢谢!啊,它是 bash 中的包装函数!需要学习在bash中编写函数,经验教训。第一个函数就像一个带有自动完成功能的魅力,我认为添加 set-x 以提供信息非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2013-04-26
    • 2020-03-08
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多