我想问一下,在某些命令之前是否有添加前缀的方法。有关这方面的大多数类似问题都是关于在命令输出中添加前缀,而不是在命令执行本身中添加前缀,下面是我的示例:
我需要连接到码头容器,我正在使用ConEmu和bash终端,所以我需要使用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添加,我的自动完成不工作,所以我需要首先编写对接命令,然后跳到命令的开头输入winpty。我希望每当我运行"docker“在bash之前添加winpty前缀时,bash就会自动检测。如何做到这一点?我知道我可以做个化名
alias de='winpty docker exec'但是,我宁愿停留在正常的停靠命令流中,以实现自动完成。
发布于 2019-11-22 09:40:37
编写一个包装docker的shell函数。如果是docker exec命令调用winpty,则使用command返回到底层的docker二进制文件。
docker() {
if [[ ${1:-} == exec ]]; then
(set -x; winpty docker "$@")
else
command docker "$@"
fi
}我把set -x放在那里,这样它就可以在调用winpty时打印出来,这样就没有隐藏的魔力了。当我的外壳在做鬼鬼祟祟的事情时,我喜欢被提醒。
$ docker exec -it my_container bash
+ winpty docker exec -it my_container bash
root@0991eb946acc:/var/www/my_container#我不熟悉winpty,但我希望winpty docker会调用对接者二进制文件,而不是这个shell函数。但是如果我错了,你就有麻烦了,因为它会在一个没完没了的递归循环中不断调用它自己。呀!如果发生这种情况,可以使用which来确保它调用二进制文件。
docker() {
if [[ ${1:-} == exec ]]; then
(set -x; winpty "$(which docker)" "$@")
else
command docker "$@"
fi
}如果您想知道shell语法:
${1}是函数的第一个argument.${1:-},它确保您不会在启用set -u以检测未设置的变量时得到“未绑定变量”错误,variables."$@"是所有函数参数的数组。https://stackoverflow.com/questions/58991297
复制相似问题