コマンドラインのbase64でうまくencode, decodeできない文字列

コマンドラインのbase64でうまくencode, decodeできない文字列

user:12:56:35 ~ $echo "3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N$jXWgERP6EtgV,>*8cG6qAy" > test.txt
user:12:57:00 ~ $base64 test.txt
M3R6UW4pI3VVVzdHTjMzd2d2fUNabW92ND8pN0hSZEEsWUM2Tiw+KjhjRzZxQXkK
user:12:57:06 ~ $base64 test.txt > test_encoded.txt
user:12:57:33 ~ $cat test_encoded.txt
M3R6UW4pI3VVVzdHTjMzd2d2fUNabW92ND8pN0hSZEEsWUM2Tiw+KjhjRzZxQXkK
user:12:57:56 ~ $base64 -D test_encoded.txt
3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N,>*8cG6qAy

encode,decodeすると$jXWgERP6EtgV部分が欠落している

  • $から始まり任意の記号までの文字列はencode,decodeの過程でなくなってしまう
    • なぜ?
    • おそらく、コマンドラインだと、$~が環境変数として扱われてしまうため。
  • BASE64エンコード/BASE64デコード - ブラウザで使えるWeb便利ツール
    • このような外部ツールでは、$が含まれていてもencode,decodeできる
    • AWS CLIのKMSなどでbase64を使う時に支障があるかもしれない

      追記

      @bogo さん からコメントにてご指摘いただきました。

      最初の例で、test.txt の内容をチェックしてみてください。おそらく期待するものと違っているはずです。 そして、コマンドラインで渡すときには文字列を "" ではなく、'' でくくってみてください。

user:20:32:28 ~ $echo "3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N$jXWgERP6EtgV,>*8cG6qAy" > test.txt
user:20:32:49 ~ $cat test.txt
3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N,>*8cG6qAy
user:20:32:52 ~ $echo '3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N$jXWgERP6EtgV,>*8cG6qAy' > test.txt
user:20:33:26 ~ $cat test.txt
3tzQn)#uUW7GN33wgv}CZmov4?)7HRdA,YC6N$jXWgERP6EtgV,>*8cG6qAy
  • ダブルクオーテーションで囲むと中に変数があった時に展開して処理される。
  • シングルクオーテーションでは、全て文字列で解釈されるため、変化しない。  

ということでした。
こちら参考にしました。 コマンドにおける引用符の動作の違い - Qiita
曖昧な知識のまま記事を投稿してしまいましたが、結果として勉強になりました。
ありがとうございました。