我可以别名子命令吗?(缩短“docker ps”的输出)
我可以别名子命令吗?(缩短“docker ps”的输出),docker,zsh,Docker,Zsh,docker命令有一个子命令ps发出很长的行: $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
docker
命令有一个子命令ps
发出很长的行:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e8ec8a16da4 waisbrot/wait:latest "/wait" 4 minutes ago Exited (0) 4 minutes ago wait-for-janus-test
9dbf0739561f whoop/downsampler:master "./run.bash" 4 minutes ago Up 4 minutes 0.0.0.0:32855->4369/tcp, 0.0.0.0:32854->9100/tcp, 0.0.0.0:32853->9101/tcp, 0.0.0.0:32852->9102/tcp, 0.0.0.0:32851->9103/tcp, 0.0.0.0:32850->9104/tcp, 0.0.0.0:32849->9105/tcp, 0.0.0.0:32848->9106/tcp, 0.0.0.0:32847->9107/tcp, 0.0.0.0:32846->9108/tcp, 0.0.0.0:32845->9109/tcp, 0.0.0.0:32844->9110/tcp metrics-downsampler-test
6cf56623bb48 whoop/janus:master "./start.bash" 4 minutes ago Up 4 minutes 0.0.0.0:32843->80/tcp janus-test
882b50303d54 whoop/recalculator:master "./run.bash" 4 minutes ago Exited (1) 4 minutes ago internum-test
可以指示它仅输出特定列:
docker ps --format "table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"
我希望能够说docker ps
,并为我添加--format“table…”
参数。有什么好办法吗
我知道我可以说
alias dp='docker ps --format ...'
但我宁愿保留副司令部
我使用zsh作为shell。您可以将
docker
包装到一个函数中,该函数检查特定的子命令,并将所有其他内容传递给它。(以下内容实际上不仅适用于zsh,还适用于任何兼容POSIX的shell——zsh并不完全属于这一类别)
如果您想要一个更通用的包装函数(不需要知道您所需的特定
ps
逻辑),可以按如下方式完成(请注意,由于使用了local
,此版本与基线POSIX sh不兼容;然而,这是一个扩展,甚至由ash
及其派生版本实现):
…之后,任何子命令都可以定义自己的函数,而无需修改包装器来了解它们(您也可以在名为docker\u ps
的路径中创建脚本,或以您选择的任何其他方式提供命令):
您可以对子命令进行别名。使用别名,您仍然可以像键入完整命令一样获得漂亮的zsh补全。这就是为什么我更喜欢它们而不是函数 您的别名的等效项是:
alias dp='docker ps--format“table{{.Image}\t{{.Names}\t{{.Ports}}\t{{.Status}”
但是现在似乎推荐使用完整的命令,ls
取代了ps
,这使得您的别名现在:
alias dp='docker container ls--format“table{{.Image}\t{{.Names}\t{{.Ports}}\t{{.Status}”
每件事都有docker的别名真是太好了。为此,我一直在开发一组,其中您的别名类似于:
alias ddcls='docker container ls--format“table{{.Image}\t{{.Names}\t{{.Ports}}\t{.Status}”
使用Docker配置
因为这基本上是一个docker问题,而不是bash问题,所以您甚至不需要别名。Docker CLI允许您在自己的配置文件中自定义这些命令!以下是一个很棒的提示:
~/.docker/config.json
ps
命令时使用的默认格式,作为配置中的顶级属性:
{
“psFormat”:“表{.Image}\t{{.Names}\t{{.Ports}\t{{.Status}”,
}
.ID
容器ID
.Image
图像ID
.Command
引用命令
.CreatedAt
创建容器的时间。
.RunningFor
自容器启动以来经过的时间。
.port
暴露端口。
.Status
集装箱状态。
.Size
容器磁盘大小。
.Names
容器名称。
.Labels
指定给容器的所有标签。
.Label
此容器的特定标签的值。
.Mounts
此容器中装入的卷的名称。
.Networks
连接到此容器的网络的名称。
在我的例子中,我只需要禁用
docker登录
命令(一些人在我们的CI runner上使用该命令来破坏docker的通用配置文件)。
因此,我在我的.bashrc
中添加了:
_docker() {
if [ "$1" = "login" ]; then
echo "login is disabled, to login please update a config file manually!"
return
fi
/usr/bin/docker "$@"
}
alias docker="_docker"
一般来说,shell别名的功能非常小——前缀替换,没有条件逻辑的空间。如果你想做任何花哨的事情,函数总是更好。我不知道如何使用
命令来允许函数和二进制共存。第二个版本是一种考虑pro的好方法也有问题。谢谢!我不能为这一想法说句公道话——看看git-foo
如何运行git-foo
;我在这里使用了下划线,以允许使用符合标准的函数名(可以在bash和zsh中定义名称中带有破折号的函数,但不能使用POSIX-sh)。
docker() {
local cmd=$1; shift
if command -v "docker_$cmd" >/dev/null 2>/dev/null; then
"docker_$cmd" "$@"
else
command docker "$cmd" "$@"
fi
}
docker_ps() {
command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@"
}
_docker() {
if [ "$1" = "login" ]; then
echo "login is disabled, to login please update a config file manually!"
return
fi
/usr/bin/docker "$@"
}
alias docker="_docker"