为什么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
命令用于返回所选容器/服务的请求发布端口和内部端口号。