这是我正在使用(或尝试使用)来恢复 docker 容器中的数据库的函数:
function restoredb() { # source: see above local wkdir="pwd | rev | cut -d "/" -f1 | rev" local container='echo ${wkdir}_my-wpdb_1' cat backup.sql | docker exec -i ${container} /usr/bin/mysql -u root --password=dockerpass wordpress }
我希望该docker exec
函数能够以${container}
与未通过管道传输的方式相同的方式进行解释:
function dumpdb() { # source https://stackoverflow.com/a/46042938/2223106 # source https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb local wkdir="pwd | rev | cut -d "/" -f1 | rev" local container='echo ${wkdir}_my-wpdb_1' docker exec ${container} mysqldump -uroot --password=password wordpress > backup.sql }
当我按原样运行该函数时,Dockerexec
正在寻找一个名为 的容器echo
。
我想象这也许eval
会有tee
帮助,但我有点不明白。
之后运行命令set -x
非工作的输出restoredb
是:
+ restoredb + local 'wkdir=pwd | rev | cut -d / -f1 | rev' + local 'container=echo ${wkdir}_my-wpdb_1' + cat backup.sql + docker exec -i echo '${wkdir}_my-wpdb_1' /usr/bin/mysql -u root --password=dockerpass wordpress Error response from daemon: No such container: echo ++ checkdir ++ '[' -n '' ']' ++ '[' -z '' -a -d env ']'
对于工作人员来说dumpdb
:
+ docker exec renaissance_my-wpdb_1 mysqldump -uroot --password=dockerpass wordpress ++ pwd ++ checkdir ++ '[' -n '' ']' ++ '[' -z '' -a -d env ']'
然后对于像我一样无知的人来说,set +x
删除冗长的输出。
答案1
反转两次来获取工作目录是不正当的。你只是想要这个:
basename `pwd`
(或者basename $PWD
如果你愿意的话。)
将命令放入管道与这个问题无关,因为它似乎都是关于引用的。如果您确实想探索引用细节,您可以cat ReadMe | some_cmd | sort
与进行比较cat ReadMe | bash -c 'some_cmd' | sort
。
当你写的时候
local container='echo ${wkdir}_my-wpdb_1'
我不明白你希望echo
在其中扮演什么角色。请注意,单引号会抑制 $ 变量扩展。你不想要这个吗?
local container="${wkdir}_my-wpdb_1"
(您甚至可以省略引号,因为工作目录没有空格。)
使用echo $container
或进行调试set -x
,然后按上述执行:... | docker exec -i ${container} /usr/bin/mysql ...