環境変数にRSAキーを改行文字を含むテキストファイルに設定しようとしています。
ファイルから読み込み、それを環境変数に渡そうとするたびに、最初の行の改行文字で停止します。これが起こらないようにするにはどうすればよいですか?
ベストアンサー1
zsh を除いて、シェル変数は任意のバイトシーケンスを格納できません。他のすべてのシェルの変数にはNULバイトを含めることはできません。の場合、yash
有効な文字を形成しないバイトを含めることはできません。
NULバイトを含まないファイルの場合は、POSIXに似たシェルで次のことができます。
var=$(cat file; echo .); var=${var%.}
すべての末尾の改行が削除されることを説明するために、.\n
末尾を追加して削除します。.
$(...)
上記の方法はzsh
NULを含むファイルでも機能しますが、特別な連想配列を使用することもzsh
できます。$mapfile
zmodload zsh/mapfile
var=$mapfile[file]
zsh または bash では、次のものも使用できます。
{ IFS= read -rd '' var || :; } < file
最大最初の NUL バイトを読み取ります。 NUL バイトが見つからない場合は、ゼロ以外の終了状態を返します。ここでコマンドグループを使用すると、少なくともファイルを開くとエラーがわかりますが、シャットダウン状態で読み取りエラーを検出することはできません。
他のコマンドに渡すときにこの変数を引用することを忘れないでください。 Newlineがデフォルトであるため、$IFS
zsh以外のPOSIX様シェルでリストコンテキストで引用を解除すると、変数の内容が分割されます($IFS
他の文字やワイルドカードに関する他の問題は言うまでもありません)。
だから:
printf %s "$var"
たとえば(いいえ、もちろんそうではありません。これはSplit + globにprintf %s $var
問題が追加されます)。echo $var
echo
非 POSIX シェルの場合:
ボンシェル:
Bourneシェルはフォーム$(...)
や${var%pattern}
演算子をサポートしていないため、実装するのは難しいです。 1つの方法は、以下を使用してeval
引用することです。
eval "var='`printf \\' | cat file - | awk -v RS=\\' -v ORS= -v b='\\\\' '
NR > 1 {print RS b RS RS}; {print}; END {print RS}'`"
これにより、(t)csh
状況はさらに悪化します。見てそこ。
を使用すると、空の区切り文字のリストを含むコマンド置換形式をrc
使用できます。``(separator){...}
var = ``(){cat file}