私が知る限り、bashで推奨されるパターンは常にシェル変数を引用することです。
例えば。"$VAR"
代わりに、引用符が解釈される変数に提供するのと同じ安全性をどのように取得できますか?$VAR
離れて?
たとえば、次のようになります。
ssh server.com<<CODE
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
コードが機能するには、および$COUNT
をエスケープする必要があります$TARGET
。
しかし、この特定のケースに対して「$COUNT」または「$TARGET」が提供するのと同じセキュリティをどのように達成できますか?
修正する
問題のある部分だけを貼り付けました。
変数が区切られた文書の外側に定義された他の行があるため<<'CODE'
。
より完全な例:
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo $SOME_VALUE > test_file.txt # <--- does not work if I use <<'CODE'
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
ベストアンサー1
この記事では二重引用符が保持されているようです。たとえば、次のコマンドを考えてみましょう。
cat <<HEREDOC
"this will still be quoted"
HEREDOC
これにより、出力として次の引用符付き文字列が生成されます。
"this will still be quoted:
したがって、通常どおり変数を参照できる必要があります。
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo "$SOME_VALUE" > test_file.txt
TARGET="target dir"
COUNT="\$( ls /foo/bar/\$TARGET | wc -l )"
echo "\$COUNT" > count.txt
CODE
コマンド置換で変数を参照する方法については、次の記事を参照してください。Bashで$(コマンドを置き換える)内で引用
SOME_STRING
コードスニペットをそのままコピーしましたが、代わりに変数を使用しようとしていたようですSOME_VALUE
。以下は、ローカルで実行して予想される結果を得るために少し変更されたコードの一部です。
mkdir -p "/foo/bar/target dir"
SOME_STRING="SOME VALUE"
ssh localhost<<CODE
echo "$SOME_STRING" > test_file.txt
TARGET="target dir"
COUNT="\$( ls "/foo/bar/\$TARGET" | wc -l )"
echo "\$COUNT" > count.txt
CODE