在管道命令中扩展 bash 变量

在管道命令中扩展 bash 变量

这是我正在使用(或尝试使用)来恢复 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 ...

相关内容