该docker命令有一个ps发出很长行的子命令:
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..."为我增加论点。有没有很好的方法可以做到这一点?
docker ps
--format "table..."
我知道我可以说
alias dp='docker ps --format ...'
但我宁愿保留该子命令。
我正在使用zsh作为我的外壳。
您可以包装docker一个检查特定子命令并传递其他所有内容的函数。(以下内容实际上不仅适用于zsh,而且适用于任何POSIX兼容的shell(zsh并不完全属于该类别)。
docker() { case $1 in ps) shift command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@" ;; *) command docker "$@";; esac }
如果您想要一个更通用的包装器函数(不需要了解特定的所需ps逻辑),可以按照以下步骤进行操作(请注意,由于使用了该版本,该版本与基线POSIX sh 不 兼容local;但是,是甚至由ash及其衍生物实现的扩展):
local
ash
docker() { local cmd=$1; shift if command -v "docker_$cmd" >/dev/null 2>/dev/null; then "docker_$cmd" "$@" else command docker "$cmd" "$@" fi }
…之后,可以定义任何子命令自己的功能,而无需修改包装器以了解它们(您也可以在PATH中创建名为的脚本docker_ps,或以您选择的任何其他方式提供命令):
docker_ps
docker_ps() { command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@" }