안녕하세요 저는 bash 스크립트의 특정 라인에 문제가 있습니다.이스케이프 된 bash -c 문자열 내부의 mysql 쿼리. 견적을 제출하는 방법?
ssh $SOURCEIP "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 \"mysql --silent -h $TARGET -uroot -ppass -e 'SELECT * FROM dbname.tablename WHERE size = $SIZE;' >> out.txt\""
문제는 내가 따옴표의 부족이다 다음은 코드입니다. "mysql"의 시작 부분에있는 여는 따옴표와 이스케이프 된 큰 따옴표는 "bash -c"에서 시작하는 것을 닫습니다. mysql 문을 큰 따옴표로 묶고 쿼리를 작은 따옴표로 묶어야합니다. 그렇지 않으면 오류가 발생하고 처리 방법을 알 수 없습니다. 나는 패스워드를 넘겨서는 안된다는 것을 알고 나중에 변경 될 것입니다. --silent
이 이것을 억제하지 않기 때문에 나는 이것을 테스트 할 때마다 "$ ITER"경고를 받게됩니다. 문제 코드는이 데이터 전송을 수행하기로되어있는 작은 쉘 스크립트의 일부입니다. 다른 스크립트와의 일관성 때문에 병렬 처리가 아닌 ssh를 사용하여 다른 시스템으로 변경하고 싶습니다.
기본적으로 bash -c 명령을 둘러싼 이중 인용 부호가 필요합니다.이 병렬 처리가 작동하려면 이미 ssh doublequotes를 열어 이스케이프 처리가되어 있어야하며 mysql 명령도 따옴표 안에 넣어야합니다. 그들은 어떻게 든 서로를 닫고 있습니다.
도움이 될 것입니다. 미리 감사드립니다. Largio
편집 : 다음 명령은 나를 위해 일한 @ OLE-단게에 의해 제안 (SOLUTION) .
parallel --shellquote | parallel --shellquote
셸에서 호출 한 후, 질문에 내 문자열을 붙여 넣고 마스크 된 문자열을 다시 가져 왔습니다. 나는 붙여 넣기가 정확히 무엇인지 알아내는 데 여전히 어려움을 겪었지만 결국은 논리적이다.
sql mysql://root:[email protected]$TARGET/ 'SELECT data FROM db_name.tablename WHERE size = ${SIZE};' >> out.txt
하지만 여전히 난 내 쿼리 안에 내 변수 몇 가지 문제가 있었다 : 정확히 어떤 내가 quoter에 붙여 넣기하는 것은이었다. 여기서 문제는 병렬 할당 자에 의해 모든 것이 가려진 후에 $ TARGET 및 $ SIZE의 2 개 변수를 마스킹 해제해야한다는 것입니다. 어쩌면 내 사고 방식이 너무 힘드지만 다른 방식으로 작동하지 않을 수도 있습니다. 또한 내 계획이 전에 있었던 것처럼 전체 SQL 문을 따옴표로 묶지 않았다는 점에 유의하십시오. 이제는 견적인이이를 보상했기 때문입니다. 일관성 이유로 나는 (이후 내 변화) 결국 작업있어 최종 문자열을 붙여 넣습니다
ssh $SOURCEIP "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 sql\\\ mysql://root:[email protected]$TARGET/ \\\'SELECT\\\ data\\\ FROM\\\ db_name.tablename\\\ WHERE\\\ size\\\ =\\\ ${SIZE}\\\;\\\'\\\ \\\>\\\>\\\ out.txt\""
당신이 그를 인용하기 때문에 당신이 누군가의 이름을 잘 알고있는 그 순간 귀하의 석사 학위 논문에서 당신이 그의 소프트웨어를 사용하고 있기 때문에 그 사람이 스택 오버플로에 대한 질문에 대답하기 때문입니다. 놀랄 만한. 고맙습니다 @ OleTange. – Largio