
シェルスクリプトで...
末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?
今私は次を試しました。
var=`cat`
var=`tee`
var=$(tee)
いずれの場合も、$var
入力ストリームに末尾の改行はありません。ありがとうございます。
また: ある場合いいえ入力に末尾の改行文字がある場合、解決策は次のようになります。1つ追加。
許可された回答に基づいて更新:
私のコードで使用した最終的な解決策は次のとおりです。
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
コード全体を見たい場合は、githubページをご覧ください。増量剤、少しオープンソースgitキーワード拡張フィルタ情報セキュリティの目的で開発したシェルスクリプトです。定められた規則に従って.git属性ファイル(支店によって異なる場合があります)と子の設定、gitは各ファイルをパイプします。エキスパンダーシェルスクリプトは、リポジトリにチェックインまたはチェックアウトするたびに実行されます。 (これが後続または欠落している改行を維持することが重要な理由です。)これにより、機密情報を整理し、テスト、ステージング、ライブブランチのさまざまな環境固有の値のセットを交換できます。
答え1
値が変数に保存される前に、末尾の改行は削除されます。次の操作を実行できます。
var=`cat; echo x`
${var%x}
代わりに使用してください$var
。たとえば、次のようになります。
printf "%s" "${var%x}"
これは末尾の改行問題を解決しますが、NULLバイトの問題(stdinがテキストでない場合)は解決しません。POSIXコマンドによる交換:
出力に null バイトが含まれている場合、動作は指定されません。
ただし、シェル実装はヌルバイトを保持できます。
答え2
read
組み込み関数を使用してこれを実行できます。
$ IFS='' read -d '' -r foo < <(echo bar)
$ echo "<$foo>"
<bar
>
STDIN を読み取るスクリプトの場合は、次のようにします。
IFS='' read -d '' -r foo
これがどのシェルで動作するのか分かりません。しかし、bashとzshの両方でうまく動作します。
答え3
次のことができます。
input | { var=$(sed '$s/$/./'); var=${var%.}; }
$var
とにかくグループから出ると、あなたがした{ current shell ; }
ことはすべて消えます。ただし、次のように動作することもできます。
var=$(input | sed '$s/$/./'); var=${var%.}
答え4
このソリューションの移植性と堅牢性については言及できませんが、期待に応えました。
var=$(</dev/stdin)