파이프 명령에서 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

작업 디렉토리를 얻기 위해 두 번 되돌리는 것은 합법적이지 않습니다. 당신은 이것을 원합니다 :

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

관련 정보