docker - 我可以给子命令起别名吗? (缩短 `docker ps` 的输出)

标签 docker zsh

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 不完全属于的类别)。

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 及其衍生产品实现):

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 的 PATH 中创建一个脚本,或提供以您选择的任何其他方式执行命令):

docker_ps() {
  command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@"
}

关于docker - 我可以给子命令起别名吗? (缩短 `docker ps` 的输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748747/

相关文章:

zsh - 由于 zsh 中的日期命令,多行提示格式不正确

docker - Quarkus:测试容器内置的原生镜像

docker - redis: ReplyError: ERR DB 索引超出范围

docker - "[error] Input file not found!"Docker OSRM

macos - Zsh tab 完成复制命令名称

zsh:显示命令花费的时间

autocomplete - *真的*关闭zsh自动更正

docker - 多行docker run命令

docker - 覆盖另一个文件时,Dockerfile COPY命令将一个空文件放入其容器中

mongodb - 使用 zsh 在 Mac 上找不到 Mongo 命令?