私は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
単一のコマンド(改行はオプション)でこれを作成できますが、2つのレベルの引用が必要です。 1つはローカルシェル用、もう1つは削除シェル用です。
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"'
rootとして実行する必要がなく、jq
単にrootとしてファイルを読みたい場合は、次のようにします。
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'