シェルスクリプトで...
末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?
今私は試しました:
var=`cat`
var=`tee`
var=$(tee)
すべての場合$var
において、入力ストリームの末尾の改行はありません。ありがとう。
また、入力に後続の改行がない場合、ソリューションは追加しません。
承認された回答に照らして更新:
私のコードで使用した最終的な解決策は次のとおりです。
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キーワード展開フィルターシェルスクリプトです。.gitattributesファイル(ブランチ固有にすることができます)およびgit configで設定されたルールに従って、git は、リポジトリにチェックインまたはチェックアウトするたびに、expandr.shシェルスクリプトを介して各ファイルをパイプ処理します。(そのため、末尾の改行またはその欠如を保持することが重要でした。)これにより、機密情報をクレンジングし、テスト、ステージング、およびライブブランチの環境固有の値の異なるセットを交換できます。
filter
、最初に改行で終わっていなかった入力ストリームの最後に改行文字が追加されるからです。実際、私は元々そうしていましたfilter
が、「常に改行を追加する」も「常に改行を削除する」も許容できるソリューションではないため、この解決策に導いたその問題に遭遇しました。
sed
おそらく余分な改行を行います-しかしfilter
、残りのすべてではなくそれを処理する必要があります。そして、あなたが持っているそれらのすべての機能は基本的に同じことをします-a sed s///
。シェルを使用して、メモリに保存したデータをパイプしているsed
ため、そのsed
データを、シェルがメモリに格納している他のデータに置き換えて、sed
パイプでシェルに戻すことができます。なぜ[ "$var" = "$condition" ] && var=new_value
ですか?私はまた、配列を得ることはありません-あなたは、アレイの名前を格納している[0]
使用して、その後sed
の値とそれを置き換えるために[1]
?たぶんチャット?
filter
か?それは現状のまま完全に機能します。私のリンクのコードがどのように機能するか、そしてなぜ私が自分のやり方でそれをセットアップしたのかについて、ええ、チャットルームでそれについて話しましょう。
filter
取るstdin
-それが実行されsed
ます。あなたは、キャッチstdin
に$GIT_INPUT
までその背中を印刷し、その後stdout
オーバーパイプにfilter
、そのキャッチstdout
でを$FILTERED_OUTPUT
して、背中にそれを印刷しますstdout
。上記の例の下部にある4行はすべて、次のように置き換えることができますfilter
。ここでの違反は意味しません、それはただ...あなたは働きすぎです。ほとんどの場合、シェル変数は必要ありません。入力を適切な場所に送信して渡すだけです。