![パイプコマンドでbash変数を拡張する[閉じる]](https://linux33.com/image/117356/%E3%83%91%E3%82%A4%E3%83%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7bash%E5%A4%89%E6%95%B0%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
これは、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 ...