将带有 space 的命令字符串传递给 docker-compose exec
Pass a command string with space to docker-compose exec
现实生活场景:在我的自动化脚本中,酒保容器上有一个 运行 barman recover
的 cli。但是,可以将 "ssh xxx"
作为整个字符串参数传递给 --remote-ssh-command
,并且酒保报告“酒保:错误:无法识别的参数:postgres@IP -p 60022”
docker-compose exec -T barman barman recover SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming --remote-ssh-command "ssh postgres@IP -p 60022"
# I tried with bach -c trick, still no luck.
docker-compose exec -T barman bash -c "barman recover SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming --remote-ssh-command 'ssh postgres@IP -p 60022'"
为简化起见,想象一个最小的复制案例:
docker-compose exec -T barman bash -c "echo hello"
# (It echos nothing. But I want it to behave like the following.)
docker-compose exec -T barman echo hello
# hello
问题是,如何通过 docker-compose exec
传递带引号的字符串参数?
感觉远程命令需要转义两次(第一次转义是用double-quotes):
#!/bin/bash
docker-compose exec -T barman \
barman recover \
SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming \
--remote-ssh-command "$(printf %q "ssh postgres@IP -p 60022")"
我的解决方案:使用 docker compose
而不是 docker-compose
。
docker compose exec -T barman bash -c "echo hello"
# hello
docker-compose exec -T barman echo hello
# hello
我认为 Python 版本 (docker-compose) 不能很好地处理 space 的参数。幸运的是 Go 版本(docker compose)没有这样的问题。
我尝试了@Fravadona 的回答,但不幸的是在 Alpine Linux 中 printf
没有 %q
.
现实生活场景:在我的自动化脚本中,酒保容器上有一个 运行 barman recover
的 cli。但是,可以将 "ssh xxx"
作为整个字符串参数传递给 --remote-ssh-command
,并且酒保报告“酒保:错误:无法识别的参数:postgres@IP -p 60022”
docker-compose exec -T barman barman recover SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming --remote-ssh-command "ssh postgres@IP -p 60022"
# I tried with bach -c trick, still no luck.
docker-compose exec -T barman bash -c "barman recover SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming --remote-ssh-command 'ssh postgres@IP -p 60022'"
为简化起见,想象一个最小的复制案例:
docker-compose exec -T barman bash -c "echo hello"
# (It echos nothing. But I want it to behave like the following.)
docker-compose exec -T barman echo hello
# hello
问题是,如何通过 docker-compose exec
传递带引号的字符串参数?
感觉远程命令需要转义两次(第一次转义是用double-quotes):
#!/bin/bash
docker-compose exec -T barman \
barman recover \
SRV1 last /var/lib/postgresql/data/pgdata/recovered.streaming \
--remote-ssh-command "$(printf %q "ssh postgres@IP -p 60022")"
我的解决方案:使用 docker compose
而不是 docker-compose
。
docker compose exec -T barman bash -c "echo hello"
# hello
docker-compose exec -T barman echo hello
# hello
我认为 Python 版本 (docker-compose) 不能很好地处理 space 的参数。幸运的是 Go 版本(docker compose)没有这样的问题。
我尝试了@Fravadona 的回答,但不幸的是在 Alpine Linux 中 printf
没有 %q
.