null 文字を区切り文字として使用してパラメータとして渡される文字列の連結

null 文字を区切り文字として使用してパラメータとして渡される文字列の連結

$a"\0"$b"\0"$c"\0"$d私は$ a、$ b、$ c、$ dなどの引数を受け入れ、それを標準出力に書き込むCLIツールを探しています。 CLIでパイプラインの先頭に使用できる標準ツールはありますか?私の実装では、カスタムecho区切り文字を受け入れないようです。

答え1

printfこの問題は、ほとんど次のように解決できます。

printf "%s\0" "$a" "$b" "$c" ...

printf必要に応じて対応する書式文字列を繰り返します(この場合は各パラメータに対して1回)。これにより、各パラメータの後にヌルバイトが続きます。

最後のヌルバイトを削除するには、GNUを使用してくださいhead

printf "%s\0" "$a" "$b" "$c" ... | head -c-1

Zshの組み込み機能printも後処理なしでこれを行うことができます。

print -rNn "$a" "$b" "$c" ...

-rエスケープ処理を無効にし、-N引数をnullバイトで区切って終了し、-n端末の改行を無効にします。ありがとうございます。スチールドライバーヒントをください! )

答え2

このprintfコマンドは必要に応じてフォーマットを繰り返すので、次のことができます。

print "%s\0"

私たちは実際にそれを見ることができます:

$ printf "%s\0" hello there | hdump -8                   
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00               ere.

$ printf "%s\0" hello there everyone out there | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65 00      .there.

また、文字列の末尾に端末 NUL を配置することに注意してください。これを望まない場合は削除できます。sed 's/.$//'

$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65         .there

関連情報