이것은 인간의 마음에서 작동하지만 쉘은 인용문을 무시합니다.
for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done
가독성을 잃지 않고 어떻게 이 줄을 인용할 수 있나요?
답변1
따옴표를 이스케이프 처리해야 합니다. 패키지 전달 게임에서 패키지 레이어로 생각하십시오. 각 쉘은 "레이어"를 엽니다.
그래서:
echo "this ; is a semicolon"
그러나 SSH를 통해 실행하려면 다음을 수행하십시오.
ssh $user@$host echo "this ; is a semicolon"
이것SSH패키지의 첫 번째 레이어가 열립니다 - 전송:
echo this ; is a semicolon
이는 세미콜론이 쉘에 의해 해석되기 때문에 중단됩니다.
따라서 이렇게 하려면 먼저 따옴표를 이스케이프 처리해야 ssh가 한 레이어를 안전하게 "잠금 해제"할 수 있습니다.
ssh $user@$host echo "\"this ; is a semicolon\""
따라서 ssh는 "외부" 및 "이스케이프 레이어"를 제거하고 다음을 전달합니다.
echo "this ; is a semicolon"
이것은 라이너 중 하나에 대해 수행해야 할 작업입니다. 가독성을 잃지 않는 것에 관해서는 이스케이프 및 인용 중첩이 필연적으로 지저분해지기 때문에 말처럼 쉽지는 않습니다.
내가 제공할 수 있는 최선의 방법은 변수를 사용하여 SQL 문을 래핑하는 것입니다. 그러면 최소한 "래핑된 문"을 보내는 것이 분명해집니다.
THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO