改行文字を含む環境変数をどのように設定しますか?

改行文字を含む環境変数をどのように設定しますか?

環境変数にRSAキーを改行文字を含むテキストファイルに設定しようとしています。

ファイルから読み込み、それを環境変数に渡そうとするたびに、最初の行の改行文字で停止します。これが起こらないようにするにはどうすればよいですか?

ベストアンサー1

zsh を除いて、シェル変数は任意のバイトシーケンスを格納できません。他のすべてのシェルの変数にはNULバイトを含めることはできません。の場合、yash有効な文字を形成しないバイトを含めることはできません。

NULバイトを含まないファイルの場合は、POSIXに似たシェルで次のことができます。

var=$(cat file; echo .); var=${var%.}

すべての末尾の改行が削除されることを説明するために、.\n末尾を追加して削除します。.$(...)

上記の方法はzshNULを含むファイルでも機能しますが、特別な連想配列を使用することもzshできます。$mapfile

zmodload zsh/mapfile
var=$mapfile[file]

zsh または bash では、次のものも使用できます。

{ IFS= read -rd '' var || :; } < file

最大最初の NUL バイトを読み取ります。 NUL バイトが見つからない場合は、ゼロ以外の終了状態を返します。ここでコマンドグループを使用すると、少なくともファイルを開くとエラーがわかりますが、シャットダウン状態で読み取りエラーを検出することはできません。

他のコマンドに渡すときにこの変数を引用することを忘れないでください。 Newlineがデフォルトであるため、$IFSzsh以外のPOSIX様シェルでリストコンテキストで引用を解除すると、変数の内容が分割されます($IFS他の文字やワイルドカードに関する他の問題は言うまでもありません)。

だから:

printf %s "$var"

たとえば(いいえ、もちろんそうではありません。これはprintf %s $varSplit + globに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}

おすすめ記事