パイプコマンドで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 }

関数をそのまま実行すると、Dockerはexecというコンテナを探します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

作業ディレクトリを取得するために2回戻すことは正当ではありません。あなたはこれが欲しい:

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 ...

おすすめ記事