如何在bash命令之前添加自动前缀([prefix] docker exec)

时间:2019-11-22 09:34:40

标签: bash docker terminal

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

myImageView.image = UIImage(data: imageData)

结果:

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命令,然后跳转至命令开头以输入winpty。我想让bash在运行“ docker exec”时在其之前添加winpty前缀时自动检测。 如何实现呢? 我知道我可以为

做一个别名
winpty docker exec -it my_container bash

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

但是我宁愿使用普通的docker命令流来实现自动补全。

1 个答案:

答案 0 :(得分:2)

编写一个包装docker的shell函数。如果是docker exec命令调用winpty,请使用command退回到基础docker二进制文件。

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

我将set -x放在其中,以便在调用winpty时将其打印出来,这样就没有隐藏的魔术了。我想在我的壳做鬼鬼things的事情时得到提醒。

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

我对winpty不熟悉,但是我希望winpty docker会调用docker二进制文件而不是此Shell函数。但是,如果我错了,那是麻烦,因为它会在无尽的递归循环中反复调用自身。 kes!如果发生这种情况,您可以使用which来确保它调用了二进制文件。

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

如果您想了解shell语法:

  • ${1}是函数的第一个参数。
  • ${1:-}确保您没有启用set -u来检测未设置变量的机会,不会出现“未绑定变量”错误。
  • "$@"是函数所有参数的数组。
相关问题