我可以别名子命令吗?(缩短“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配置文件(如果您曾经使用过,应该已经创建了该文件)

    ~/.docker/config.json
    
  • 然后添加docker每次运行
    ps
    命令时使用的默认格式,作为配置中的顶级属性:

    {
    “psFormat”:“表{.Image}\t{{.Names}\t{{.Ports}\t{{.Status}”,
    }
    
  • 然后像平常一样跑:

  • PS格式 Docker使用并拥有:

    命令 描述
    .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"