xargsが複数行の文字列を単一の引数として受け入れるように設定する

xargsが複数行の文字列を単一の引数として受け入れるように設定する
git log --format=%B -n 1 HEAD | xargs -I{} npx ts-node --esm ./foobar.ts {}

gitを使用して、最新のコミットメッセージをメッセージ内の配布タグを見つけるスクリプトに渡すことを目的としたこのコード行があります。

複数行のコミットメッセージの場合、xargsはfoobar.tsを複数回呼び出してメッセージ全体をパラメータとして渡すのではなく、コミットメッセージの各行を入力として使用します。この問題をどのように解決できますか?

答え1

これを使用して、コマンドに渡す引数を入力からNULに区切るように-0指示できますxargs。コミットログにはNUL文字を含めることはできないため、入力全体(最後の行を含む)を1つの引数としてコマンドに渡します。

git log --format=%B -n 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

ただし、現在のすべてのxargs実装が区別されていないレコードを無視するわけではありませんが、通常の状況では、これは潜在的に危険なことです。、POSIXは標準の次のバージョンで指定さ-rれ、-0無視することをお勧めします(必須ではありません)。:

標準入力が空でなく null バイトで終わらない場合、後続の null 以外のバイトは無視する必要xargsがあります (これは不完全なデータを示す可能性があります)、ユーティリティに渡される最後の引数として使用できます。

したがって、これへの依存は将来の状況に適応できない可能性があります。 NULを追加できますが、NULでコミットを区切るオプションをサポートしている(git...; printf '\0') | xargs -r0...ので、将来的にも使用できます。git log-z

git log --format=%B -zn 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

複数の投稿を送信することもできます。

あるいは、シェルのコマンド置換を使用することもできます。

npx ts-node --esm ./foobar.ts "$(git log --format=%B -n 1 HEAD)"

コマンド置換は、空でない最後の行の行区切り文字とその行の後の空の行(存在する場合)を含むすべての末尾の改行を削除します。

xargsいかなる状況でも、入力は引き続き引用処理を実行し、アポストロフィを含むコミットログをブロックしたり、引用またはバックスラッシュの内容を含むエントリを中断することなく、または一緒に使用することはできません。-I-0-dxargs

関連情報