Expanda a variável bash no comando piped [closed]

0

Esta é a função que estou usando - ou tentando usar - para restaurar um banco de dados em um contêiner do 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 }

Gostaria que a função docker exec interpretasse ${container} da mesma forma que se não fosse canalizada:

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 }

Quando executo a função como está, o Docker exec está procurando por um contêiner chamado echo .

Eu imagino que talvez eval ou tee ajudaria, mas estou um pouco no escuro.

Execução de comandos após set -x

A saída para restoredb que não funciona é:

+ 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 ']'

Para o trabalho, dumpdb :

+ docker exec renaissance_my-wpdb_1 mysqldump -uroot --password=dockerpass wordpress ++ pwd ++ checkdir ++ '[' -n '' ']' ++ '[' -z '' -a -d env ']'

Então, para qualquer pessoa tão desinformada quanto eu, set +x remove a saída detalhada.

    
por MikeiLL 05.09.2017 / 00:33

1 resposta

3

Inverter duas vezes para obter o diretório de trabalho é perverso. Você só queria isso:

basename 'pwd'

(Ou basename $PWD se você preferir).

Colocar comandos em um pipeline não é relevante para essa pergunta, já que parece ser sobre cotação. Se você realmente quiser explorar detalhes de citação, compare o cat ReadMe | some_cmd | sort com cat ReadMe | bash -c 'some_cmd' | sort .

Quando você escreve

local container='echo ${wkdir}_my-wpdb_1'

Eu não entendo qual o papel que você espera que o echo jogue nisto. Observe que o aspas simples inibe a expansão da variável $. Você não quer simplesmente isso?

local container="${wkdir}_my-wpdb_1"

(Você pode até mesmo omitir as aspas, pois o diretório de trabalho não possui espaços).

Depure com echo $container ou set -x e execute como acima: ... | docker exec -i ${container} /usr/bin/mysql ...

    
por 05.09.2017 / 03:11