シェルスクリプトで...
後続の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?
今私は試しました:
var=`cat`
var=`tee`
var=$(tee)
すべての場合で$var
には、入力ストリームの末尾の改行はありません。ありがとう。
また、入力にno末尾の改行がある場合、解はadd oneしてはなりません。
承認された回答に照らして更新:
コードで使用した最終的なソリューションは次のとおりです。
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のページで expandr 、小さなオープンソース git keyword-expansionフィルター の情報セキュリティ用に開発したシェルスクリプトをご覧ください。目的。 。gitattributes ファイル(ブランチ固有にすることができます)および git config で設定されたルールに従って、gitは各ファイルをでパイプしますexpandr.shリポジトリにチェックインまたはチェックアウトするときのシェルスクリプト。 (そのため、後続の改行またはその欠如を保持することが重要でした。)これにより、機密情報をクレンジングし、テスト、ステージング、およびライブブランチの環境固有の値の異なるセットを交換できます。
値が変数に格納される前に、末尾の改行が削除されます。あなたは次のようなことをしたいかもしれません:
var=`cat; echo x`
${var%x}
の代わりに $var
。例えば:
printf "%s" "${var%x}"
POSIXコマンド置換による であるため、これにより後続の改行の問題は解決されますが、ヌルバイト1は解決されません(標準入力がテキストでない場合)。
出力にnullバイトが含まれている場合の動作は規定されていません。
ただし、シェルの実装ではnullバイトが保持される場合があります。
read
ビルトインを使用してこれを実現できます。
$ IFS='' read -d '' -r foo < <(echo bar)
$ echo "<$foo>"
<bar
>
スクリプトがSTDINを読み取るには、次のようにします。
IFS='' read -d '' -r foo
これがどのシェルで機能するかはわかりません。ただし、bashとzshの両方で正常に動作します。
あなたは次のようにすることができます:
input | { var=$(sed '$s/$/./'); var=${var%.}; }
あなたが何をしても $var
外に出るとすぐに消えます{ current Shell ; }
とにかくグループ化。ただし、次のように機能することもできます。
var=$(input | sed '$s/$/./'); var=${var%.}