为什么bash脚本的工作取决于terminal窗口的大小?

我知道这听起来很奇怪,但这是事情。 我有一个docker容器,托pipe一个数据库。 我有一个脚本,试图一个一个地执行一个补丁。 现在,脚本不知道数据库端口(因为每次容器绑定到不同的端口)。 所以这里是脚本的开始:

#!bin/bash echo "Calculating the port..." port=$(docker-compose ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") echo "Port is $port" 

基本上它应该在docker-compose ps的输出上作出反应,输出如下所示:

  Name Command State Ports wildfly_database-docker_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32768->3306/tcp 

但是,这是事情。 如果我的terminal窗口很小,这个脚本不起作用,端口variables是空的。 如果我全屏扩展terminal窗口,它工作正常,并做我所需要的。 我想这是因为在第一种情况下的输出被分成几行,并且不能被正确parsing。

那么,如何使bash脚本独立于窗口大小工作?

UPD 。 我发现解决scheme感谢评论。 这似乎是一个docker写作的问题。 但是,我改变了这一行后

 port=$(docker ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") 

一切工作正常。 Docker本身不受terminal大小的影响。

我发现解决scheme感谢评论。 这似乎是一个docker写作的问题。 但是,我改变了这一行后

 port=$(docker ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") 

一切工作正常。 Docker本身不受terminal大小的影响。

docker ps有一个选项--no-trunc来避免让它禁止太宽的输出,但是如果你不是首先产生宽输出的话,那就没有必要了。

通过简单地使用内置的设备来打印机器可读的输出,避免无用的grep等。

 docker ps --filter "name=database-docker" --format '{{.Ports}}' | sed 's/.*:\([1-9][0-9]*\)->.*/\1/' 

详情请参阅罚款文件 。 Go模板文档也是正确理解--format选项所必需的。 我想应该可以使用它来删除剩余的sed片段,但是我没有足够的学习能力去实际执行此操作。


Docker备忘单有以下公式:

 docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 

但是,我收到以下错误消息:

 Template parsing error: template: :1:37: executing "" at <.NetworkSettings.Por...>: map has no entry for key "NetworkSettings" 

根据您的要求,我build议将您的命令更改为:

 port=$(docker-compose port database-docker 3306 | sed 's/.*://') 

docker port和相关的docker-compose port命令用于返回所选容器/服务的请求发布端口和内部端口号。