저는 Bash 스크립트를 사용하여 Linux의 원격 컴퓨터에 액세스하고 있습니다. 내 코드는 다음과 같습니다
#!/bin/bash
ssh -i manu_bp.pem [email protected] <<EOF
sudo -s
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
echo `$(jq ".rev_component_co.mode" r1.txt)`
EOF
jq 값을 인쇄할 수 없습니다. echo $(jq '.rev_component_co.mode' r1.txt)
원격 컴퓨터의 터미널에 이 명령을 작성 하면 정확한 결과가 표시됩니다. 하지만 스크립트로 작성하고 실행하려고 하면 오류가 표시됩니다.
jq: r1.txt: No such file or directory
답변1
문자가 삽입된 jq
"인용되지 않은" 여기 문서를 사용하고 있기 때문에 로컬 컴퓨터에서 실행 중 입니다 . \`$
원격 셸에서 명령을 실행하려면 여기 문서에 전달된 텍스트를 정렬하여 명령을 포함하세요. 로컬 변수나 명령 대체를 사용하지 않으므로 가장 쉬운 방법은 리터럴 here 문서를 사용하는 것입니다.
ssh -i manu_bp.pem [email protected] <<'EOF'
sudo -s
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
echo "$(jq ".rev_component_co.mode" r1.txt)"
EOF
달러 대괄호 주위에 백틱을 사용하는 것은 실수라고 생각합니다. 이는 명령의 출력을 가져 jq
와서 실행할 명령으로 해당 출력을 사용합니다.
이를 단순화할 수 있습니다. echo "$(somecommand)"
이는 출력을 인쇄하는 복잡한 방법입니다 somecommand
(마지막 줄 바꿈을 제거하고 일부 쉘에서 백슬래시 확장을 수행하는 것과 같은 몇 가지 차이점이 있지만 이것이 중요하다면 echo
방법을 사용하는 것이 아마도 잘못된 것일 수 있습니다).
ssh -i manu_bp.pem [email protected] <<'EOF'
sudo -s
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
jq ".rev_component_co.mode" r1.txt
EOF
단 하나의 명령(개행은 선택 사항)으로 이를 작성할 수 있지만 두 가지 수준의 인용이 필요합니다. 하나는 로컬 셸용이고 다른 하나는 삭제 셸용입니다.
ssh -i manu_bp.pem [email protected] 'sudo sh -c "
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt;
jq .rev_component_co.mode r1.txt"'
루트로 실행할 필요가 없고 jq
단지 루트로 파일을 읽으려는 경우 다음을 사용하십시오.
ssh -i manu_bp.pem [email protected] '
sudo cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt;
jq .rev_component_co.mode r1.txt'